| author | wenzelm | 
| Mon, 10 May 2021 18:31:18 +0200 | |
| changeset 73658 | f6b453449cc6 | 
| 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: 
68605diff
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: 
68605diff
changeset | 17 | abbreviation degree :: "'a list \<Rightarrow> nat" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 18 | where "degree p \<equiv> length p - 1" | 
| 68578 | 19 | |
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 23 | definition (in ring) monom :: "'a \<Rightarrow> nat \<Rightarrow> 'a list" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
70019diff
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: 
70019diff
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: 
68605diff
changeset | 62 | |
| 70160 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 79 | unfolding monom_def by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 80 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 94 | by (induction p) (auto) | 
| 68578 | 95 | |
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 99 | lemma normalize_idem: "normalize ((normalize p) @ q) = normalize (p @ q)" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 100 | by (induct p) (auto) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 120 | a # (map (coeff p) (rev [0..<length p]))" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 171 | by (induction p) (auto) | 
| 68578 | 172 | |
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
70019diff
changeset | 329 | corollary normalize_trick: | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 371 | (* ========================================================================== *) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 372 | context | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 373 | fixes K :: "'a set" assumes K: "subring K R" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 374 | begin | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 375 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 377 | unfolding polynomial_def using subringE(1)[OF K] by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 378 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 380 | unfolding polynomial_def using subringE(1)[OF K] by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 381 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 383 | unfolding polynomial_def using subringE(2)[OF K] by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 384 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 386 | unfolding polynomial_def using subringE(1)[OF K] by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 387 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 390 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 392 | using eval_in_carrier[OF polynomial_in_carrier] . | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 393 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 395 | using coeff_in_carrier[OF polynomial_in_carrier] . | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 396 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 397 | end (* of fixed K context. *) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 398 | (* ========================================================================== *) | 
| 68578 | 399 | |
| 400 | ||
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 401 | subsection \<open>Polynomial Addition\<close> | 
| 68578 | 402 | |
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 403 | (* ========================================================================== *) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 404 | context | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 409 | assumes "set p1 \<subseteq> K" and "set p2 \<subseteq> K" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 410 | shows "polynomial K (poly_add p1 p2)" | 
| 68578 | 411 | proof - | 
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 416 | hence "set p2' \<subseteq> K" and "length p1 = length p2'" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 417 | using A(2-3) subringE(2)[OF K] by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 418 | hence "set (map2 (\<oplus>) p1 p2') \<subseteq> K" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 425 | using assms by auto | 
| 68578 | 426 | qed | 
| 427 | ||
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
70019diff
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: 
68605diff
changeset | 464 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 465 | end (* of fixed K context. *) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 466 | (* ========================================================================== *) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 467 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 468 | lemma poly_add_in_carrier: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 471 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 473 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 475 | let ?p2 = "(replicate (length p1 - length p2) \<zero>) @ p2" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 478 | thus ?thesis | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 479 | by (metis le_cases max.commute poly_add.simps) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 480 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 481 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 543 | using coeff_iff_polynomial_cond[OF | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 544 | poly_add_is_polynomial[OF carrier_is_subring assms] | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 546 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 547 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 548 | lemma poly_add_monom: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 550 | shows "poly_add (monom a (length p)) p = a # p" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 551 | unfolding monom_def using assms by (induction p) (auto) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 552 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 553 | lemma poly_add_append_replicate: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 554 | assumes "set p \<subseteq> carrier R" "set q \<subseteq> carrier R" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 556 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 558 | using assms by (induct p) (induct q, auto) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 559 | thus ?thesis by simp | 
| 68578 | 560 | qed | 
| 561 | ||
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 562 | lemma poly_add_append_zero: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 563 | assumes "set p \<subseteq> carrier R" "set q \<subseteq> carrier R" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 565 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 567 | using assms by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 573 | using normalize_coeff by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 574 | moreover have "set ((poly_add p q) @ [ \<zero> ]) \<subseteq> carrier R" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 575 | using poly_add_in_carrier[OF assms] by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 576 | ultimately show ?thesis | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 578 | normalize_gives_polynomial] by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 668 | have "map2 (\<oplus>) p (replicate (length p) \<zero>) = p" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 669 | using assms by (induct p) (auto) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 705 | lemma dense_repr_normalize: "dense_repr (normalize p) = dense_repr p" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 706 | by (induct p) (auto) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 707 | |
| 68578 | 708 | lemma polynomial_dense_repr: | 
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 728 | lemma monom_decomp: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
70019diff
changeset | 730 | shows "p = poly_of_dense (dense_repr p)" | 
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 740 | hence "a # l = poly_add (monom a (degree (a # l))) l" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 741 | using poly_add_monom[of l a] by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 742 | also have " ... = poly_add (monom a (degree (a # l))) (normalize l)" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 744 | unfolding monom_def by force | 
| 70160 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
68605diff
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: 
68605diff
changeset | 747 | unfolding Cons by simp | 
| 70160 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 762 | shows "polynomial K (poly_mult p1 p2)" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 773 | moreover have "set ?a_p2 \<subseteq> K" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 780 | lemma poly_mult_closed: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 781 | assumes "subring K R" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 783 | using poly_mult_is_polynomial polynomial_incl assms by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 894 | using coeff_iff_polynomial_cond[OF | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 971 | thus ?thesis | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 975 | lemma poly_mult_append_zero: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 976 | assumes "set p \<subseteq> carrier R" "set q \<subseteq> carrier R" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 978 | using assms(1) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 979 | proof (induct p) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 980 | case Nil thus ?case | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 981 | using poly_mult_normalize[OF _ assms(2), of "[] @ [ \<zero> ]"] | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 983 | next | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 984 | case (Cons a p) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 987 | using Cons(2) assms(2) by (induct q) (auto) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 991 | by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 993 | using Cons by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 996 | by (simp add: replicate_append_same) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 999 | also have " ... = normalize ((poly_mult (a # p) q) @ [ \<zero> ])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1000 | by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1001 | finally show ?case . | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1002 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1003 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1046 | poly_mult_is_polynomial[OF _ assms(2,1)]] | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1095 | lemma poly_mult_const': | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1096 | assumes "set p \<subseteq> carrier R" "a \<in> carrier R" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1099 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1101 | using assms by (induction p) (auto) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1105 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1106 | |
| 68578 | 1107 | lemma poly_mult_const: | 
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1108 |   assumes "subring K R" "polynomial K p" "a \<in> K - { \<zero> }"
 | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1116 | proof (cases p) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1117 | case Nil thus ?thesis | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1118 | using poly_mult_const'(1) in_carrier by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1119 | next | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1120 | case (Cons b q) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1124 | unfolding Cons by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1125 | thus ?thesis | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1132 | lemma poly_mult_semiassoc: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1135 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1136 | let ?cp = "coeff p" and ?cq = "coeff q" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1139 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1143 | proof | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1147 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1148 | also have " ... = coeff (poly_mult [ a ] (poly_mult p q))" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1150 | using scalar_coeff[OF assms(3), of "poly_mult p q"] | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1151 | poly_mult_coeff[OF assms(1-2)] normalize_coeff by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1154 | and "polynomial (carrier R) (poly_mult [ a ] (poly_mult p q))" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1158 | ultimately show ?thesis | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1159 | using coeff_iff_polynomial_cond by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1160 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1161 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1162 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1167 | proved. These are some tips: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1171 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1172 | lemma poly_mult_monom': | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1173 | assumes "set p \<subseteq> carrier R" "a \<in> carrier R" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1175 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1177 | using assms by (induct p) (auto) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1178 | show ?thesis | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1179 | using poly_mult_replicate_zero(1)[OF assms(1), of n] | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1180 | poly_add_zero'(1)[OF set_map] | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1181 | unfolding monom_def by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1182 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1183 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1184 | lemma poly_mult_monom: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1185 |   assumes "polynomial (carrier R) p" "a \<in> carrier R - { \<zero> }"
 | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1186 | shows "poly_mult (monom a n) p = | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1195 | thus ?thesis | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1198 | qed | 
| 68578 | 1199 | |
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1200 | lemma poly_mult_one': | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1201 | assumes "set p \<subseteq> carrier R" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1203 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1205 | using assms by (induct p) (auto) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1288 | moreover have "polynomial K (poly_mult p1 p2)" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1327 | lemma poly_mult_append_zero_lcancel: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1328 | assumes "subring K R" and "polynomial K p" "polynomial K q" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1330 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1332 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1333 | assume pmult: "poly_mult (p @ [ \<zero> ]) q = r @ [ \<zero> ]" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1334 | have "poly_mult (p @ [ \<zero> ]) q = []" if "q = []" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1336 | moreover have "poly_mult (p @ [ \<zero> ]) q = []" if "p = []" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1338 | unfolding that by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1339 | ultimately have "p \<noteq> []" and "q \<noteq> []" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1340 | using pmult by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1341 | hence "poly_mult p q \<noteq> []" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1342 | using poly_mult_integral[OF assms] by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1345 | thus "poly_mult p q = r" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1347 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1348 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1349 | lemma poly_mult_append_zero_rcancel: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1350 | assumes "subring K R" and "polynomial K p" "polynomial K q" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1352 | using poly_mult_append_zero_lcancel[OF assms(1,3,2)] | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1354 | assms(2-3)[THEN polynomial_in_carrier[OF assms(1)]] | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1355 | by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1356 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1363 | where "univ_poly R K = | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1364 |            \<lparr> carrier = { p. polynomial\<^bsub>R\<^esub> K p },
 | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1370 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1372 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1374 | unfolding univ_poly_def by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1375 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1377 | unfolding univ_poly_def by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1378 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1380 | unfolding univ_poly_def by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1381 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1382 | lemma univ_poly_zero: "zero (K[X]\<^bsub>R\<^esub>) = []" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1383 | unfolding univ_poly_def by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1384 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1386 | unfolding univ_poly_def by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1387 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1388 | |
| 70160 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 1389 | (* NEW ========== *) | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 1392 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 1393 | |
| 68578 | 1394 | context domain | 
| 1395 | begin | |
| 1396 | ||
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1399 | shows "poly_mult (poly_mult (monom a n) p) q = | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1400 | poly_mult (monom a n) (poly_mult p q)" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1401 | proof (induct n) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1402 | case 0 thus ?case | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1404 | next | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1405 | case (Suc n) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1406 | have "poly_mult (poly_mult (monom a (Suc n)) p) q = | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1407 | poly_mult (normalize ((poly_mult (monom a n) p) @ [ \<zero> ])) q" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1414 | using Suc by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1417 | poly_mult_in_carrier[OF assms(1-2)]] | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1418 | unfolding monom_def by (simp add: replicate_append_same) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1419 | finally show ?case . | 
| 68578 | 1420 | qed | 
| 1421 | ||
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1422 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1423 | context | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1424 | fixes K :: "'a set" assumes K: "subring K R" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1425 | begin | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1426 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1427 | lemma univ_poly_is_monoid: "monoid (K[X])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1428 | unfolding univ_poly_def using poly_mult_one[OF K] | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1433 | assume A: "polynomial K p1" "polynomial K p2" "polynomial K p3" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1450 | using poly_mult_prepend_replicate_zero[OF p1 | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1472 | (poly_mult p1 (poly_mult p2 p3))" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1525 | fix p assume p: "polynomial K p" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1526 | have "polynomial K [ \<ominus> \<one> ]" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1528 | hence cond0: "polynomial K (poly_mult [ \<ominus> \<one> ] p)" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1558 | interpret UP: abelian_group "K[X]" + monoid "K[X]" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1561 | by (unfold_locales) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1567 | interpret UP: ring "K[X]" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1568 | using univ_poly_is_ring . | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1575 | lemma univ_poly_is_domain: "domain (K[X])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1576 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1577 | interpret UP: cring "K[X]" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1578 | using univ_poly_is_cring . | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1579 | show ?thesis | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1581 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1582 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1583 | declare poly_add.simps[simp] | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1584 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
70019diff
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: 
68605diff
changeset | 1588 | have aux_lemma: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1591 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1592 | fix p assume p: "p \<in> carrier (K[X])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1593 | hence set_p: "set p \<subseteq> K" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1594 | unfolding univ_poly_def using polynomial_incl by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1595 | show "(map (\<lambda>a. \<ominus> a) p) \<in> carrier (K[X])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1596 | proof (cases "p = []") | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1597 | assume "p = []" thus ?thesis | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1598 | unfolding univ_poly_def polynomial_def by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1599 | next | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1600 | assume not_nil: "p \<noteq> []" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1601 | hence "lead_coeff p \<noteq> \<zero>" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1602 | using p unfolding univ_poly_def polynomial_def by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1604 | using not_nil by (simp add: hd_map) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1607 | moreover have "set (map (\<lambda>a. \<ominus> a) p) \<subseteq> K" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1608 | using set_p subringE(5)[OF K] by (induct p) (auto) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1609 | ultimately show ?thesis | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1610 | unfolding univ_poly_def polynomial_def by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1611 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1612 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1617 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1618 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1619 | interpret UP: ring "K[X]" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1620 | using univ_poly_is_ring . | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1621 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1622 | from aux_lemma | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1625 | thus ?thesis | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
70019diff
changeset | 1629 | (* NEW ========== *) | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 1630 | corollary univ_poly_a_inv_length: | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 1633 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 1634 | (* NEW ========== *) | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 1635 | corollary univ_poly_a_inv_degree: | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 1638 | |
| 68578 | 1639 | |
| 1640 | subsection \<open>Long Division Theorem\<close> | |
| 1641 | ||
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1642 | lemma long_division_theorem: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1643 | assumes "polynomial K p" and "polynomial K b" "b \<noteq> []" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1644 | and "lead_coeff b \<in> Units (R \<lparr> carrier := K \<rparr>)" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1669 | interpret UP: cring "K[X]" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1675 | using assms(3) list.exhaust_sel by blast | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1680 |       hence lc: "c' \<otimes> (\<ominus> a) \<in> K - { \<zero> }"
 | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1689 | by (simp add: univ_poly_def) | 
| 68578 | 1690 | |
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1696 | by (simp add: univ_poly_def, metis hd_Cons_tl) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1699 | by (auto simp add: univ_poly_def) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1700 | hence "?len p = ?len (b \<otimes>\<^bsub>K[X]\<^esub> s)" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1701 | unfolding Cons s' by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1704 | by (auto simp add: univ_poly_def r_neg) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1706 | using less(1)[OF _ is_polynomial] by blast | 
| 68578 | 1707 | |
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1708 | have in_carrier: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1710 | "q' \<in> carrier (K[X])" "r' \<in> carrier (K[X])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1714 | using l_div by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1716 | using in_carrier by algebra | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1718 | using in_carrier by algebra | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1728 | end (* of fixed K context. *) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1729 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
70019diff
changeset | 1732 | (* PROOF ========== *) | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 1733 | lemma (in domain) field_long_division_theorem: | 
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1739 | by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1740 | |
| 70160 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 1741 | (* PROOF ========== *) | 
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
70019diff
changeset | 1743 | lemma (in domain) field_long_division_theorem_shell: | 
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1752 | lemma polynomial_consistent [simp]: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1800 | lemma (in domain) univ_poly_a_inv_consistent: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1801 | assumes "subring K R" "p \<in> carrier (K[X])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1803 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1804 | have in_carrier: "p \<in> carrier ((carrier R)[X])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1805 | using assms carrier_polynomial by (auto simp add: univ_poly_def) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1806 | show ?thesis | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1807 | using univ_poly_a_inv_def'[OF assms] | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1809 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1810 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1811 | lemma (in domain) univ_poly_a_minus_consistent: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1812 | assumes "subring K R" "q \<in> carrier (K[X])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1814 | using univ_poly_a_inv_consistent[OF assms] | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1815 | unfolding a_minus_def univ_poly_def by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1816 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1827 | subsubsection \<open>Corollaries\<close> | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1828 | |
| 70160 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 1829 | (* PROOF ========== *) | 
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1830 | corollary (in ring) subfield_long_division_theorem_shell: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 1836 | unfolding univ_poly_consistent[OF subfieldE(1)[OF assms(1)]] | 
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1837 | by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1838 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1839 | corollary (in domain) univ_poly_is_euclidean: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1840 | assumes "subfield K R" shows "euclidean_domain (K[X]) degree" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1841 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1842 | interpret UP: domain "K[X]" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 1844 | show ?thesis | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1845 | using subfield_long_division_theorem_shell[OF assms] | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1846 | by (auto intro!: UP.euclidean_domainI) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1847 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1848 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1849 | corollary (in domain) univ_poly_is_principal: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1850 | assumes "subfield K R" shows "principal_domain (K[X])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1851 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1852 | interpret UP: euclidean_domain "K[X]" degree | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1853 | using univ_poly_is_euclidean[OF assms] . | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1854 | show ?thesis .. | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1855 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1856 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 1963 | have "monom b (Suc n) = (monom b n) @ [ \<zero> ]" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 1964 | unfolding monom_def by (simp add: replicate_append_same) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2007 | by (auto simp del: poly_add.simps) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2018 | unfolding univ_poly_def | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2019 | using polynomial_in_carrier[OF assms(1)] eval_in_carrier | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2025 | theorem (in domain) eval_cring_hom: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2026 | assumes "subring K R" and "a \<in> carrier R" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2028 | unfolding ring_hom_cring_def ring_hom_cring_axioms_def | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2030 | eval_is_hom[OF assms] cring_axioms by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2031 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2032 | corollary (in domain) eval_ring_hom: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2033 | assumes "subring K R" and "a \<in> carrier R" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2035 | using eval_cring_hom[OF assms] ring_hom_ringI2 | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2037 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2038 | |
| 70160 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2039 | subsection \<open>Homomorphisms\<close> | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2040 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2045 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2049 | proof - | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2050 | have "set p \<subseteq> carrier R" | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2053 | thus ?thesis | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
changeset | 2055 | qed | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2056 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2059 | using assms by (induct p) (auto) | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2060 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2064 | proof - | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
changeset | 2066 | using that by auto | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
changeset | 2068 | using S.normalize_coeff by auto | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2076 | thus ?thesis | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2077 | unfolding coeff_iff_polynomial_cond[OF | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2080 | qed | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2081 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2085 | using assms(1) | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2086 | proof (induct p, simp) | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2087 | case (Cons a p) | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
changeset | 2089 | using that by auto | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2090 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2096 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2099 | by simp | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2105 | using Cons by simp | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
changeset | 2107 | unfolding q_a_simp by simp | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2108 | finally show ?case . | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2109 | qed | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2110 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2111 | |
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2112 | subsection \<open>The X Variable\<close> | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2113 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2114 | definition var :: "_ \<Rightarrow> 'a list" ("X\<index>")
 | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2116 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2117 | lemma (in ring) eval_var: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2118 | assumes "x \<in> carrier R" shows "eval X x = x" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2119 | using assms unfolding var_def by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2120 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2121 | lemma (in domain) var_closed: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2123 | using subringE(2-3)[OF assms] | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2124 | by (auto simp add: var_def univ_poly_def polynomial_def) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2125 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2126 | lemma (in domain) poly_mult_var': | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2127 | assumes "set p \<subseteq> carrier R" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2128 | shows "poly_mult X p = normalize (p @ [ \<zero> ])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2129 | and "poly_mult p X = normalize (p @ [ \<zero> ])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2130 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2132 | using poly_mult_one' by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2133 | thus "poly_mult X p = normalize (p @ [ \<zero> ])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2134 | using poly_mult_append_zero[OF _ assms, of "[ \<one> ]"] normalize_idem | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2135 | unfolding var_def by (auto simp del: poly_mult.simps) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2136 | thus "poly_mult p X = normalize (p @ [ \<zero> ])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2137 | using poly_mult_comm[OF assms] unfolding var_def by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2138 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2139 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2140 | lemma (in domain) poly_mult_var: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2141 | assumes "subring K R" "p \<in> carrier (K[X])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2143 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2144 | have is_poly: "polynomial K p" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2145 | using assms(2) unfolding univ_poly_def by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2146 | hence "polynomial K (p @ [ \<zero> ])" if "p \<noteq> []" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2148 | thus ?thesis | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2150 | normalize_polynomial[of K "p @ [ \<zero> ]"] | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2151 | by (auto simp add: univ_poly_mult[of R K]) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2152 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2153 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2154 | lemma (in domain) var_pow_closed: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2157 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2158 | lemma (in domain) unitary_monom_eq_var_pow: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2162 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2163 | lemma (in domain) monom_eq_var_pow: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2164 |   assumes "subring K R" "a \<in> carrier R - { \<zero> }"
 | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2166 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2167 | have "monom a n = map ((\<otimes>) a) (monom \<one> n)" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2168 | unfolding monom_def using assms(2) by (induct n) (auto) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2169 | also have " ... = poly_mult [ a ] (monom \<one> n)" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2173 | finally show ?thesis . | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2174 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2175 | |
| 70160 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2176 | lemma (in domain) eval_rewrite: | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2179 | proof - | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
changeset | 2181 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2182 | interpret UP: domain "K[X]" | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
changeset | 2184 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2190 | by auto } | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2191 | note aux_lemma1 = this | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2192 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2195 | proof (induct n, simp) | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2196 | case (Suc n) | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2203 | using Suc by simp | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2206 | finally show ?case . | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2207 | qed } | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2208 | note aux_lemma2 = this | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2209 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2212 | by (induct l) (auto) | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2216 | note aux_lemma3 = this | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2217 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2220 | case less thus ?case | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
changeset | 2222 | case (Cons a l) | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2225 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2237 | finally show ?thesis | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2238 | unfolding Cons(1) . | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2239 | qed | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2240 | qed | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2241 | qed | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2242 | |
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2243 | lemma (in ring) dense_repr_set_fst: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2245 | using assms by (induct p) (auto) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2246 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2247 | lemma (in ring) dense_repr_set_snd: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2248 |   shows "snd ` (set (dense_repr p)) \<subseteq> {..< length p}"
 | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2249 | by (induct p) (auto) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2250 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2251 | lemma (in domain) dense_repr_monom_closed: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2252 | assumes "subring K R" "set p \<subseteq> K" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2255 | by (auto simp add: univ_poly_carrier) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2256 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2257 | lemma (in domain) monom_finsum_decomp: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2258 | assumes "subring K R" "p \<in> carrier (K[X])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2260 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2261 | interpret UP: domain "K[X]" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2262 | using univ_poly_is_domain[OF assms(1)] . | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2263 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2264 | from \<open>p \<in> carrier (K[X])\<close> show ?thesis | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2265 | proof (induct "length p" arbitrary: p rule: less_induct) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2266 | case less thus ?case | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2267 | proof (cases p) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2268 | case Nil thus ?thesis | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2270 | next | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2271 | case (Cons a l) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2272 | hence in_carrier: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2274 | using normalize_gives_polynomial polynomial_incl[of K p] less(2) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2275 | unfolding univ_poly_carrier by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2276 | have len_lt: "length (local.normalize l) < length p" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2278 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2279 |       have a: "a \<in> K - { \<zero> }"
 | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
70019diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2285 | using monom_decomp[OF assms(1) in_carrier(2)] by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2289 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2290 | moreover have "(a, (length l)) \<notin> set (dense_repr l)" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2291 | using dense_repr_set_snd[of l] by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2292 | moreover have "monom a (length l) \<in> carrier (K[X])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2297 | using UP.add.finprod_insert a by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2298 | thus ?thesis unfolding Cons . | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2299 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2300 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2301 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2302 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2303 | lemma (in domain) var_pow_finsum_decomp: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2304 | assumes "subring K R" "p \<in> carrier (K[X])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2306 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2307 | let ?f = "\<lambda>t. monom (fst t) (snd t)" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2309 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2310 | interpret UP: domain "K[X]" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2311 | using univ_poly_is_domain[OF assms(1)] . | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2312 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2313 | have set_p: "set p \<subseteq> K" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2314 | using polynomial_incl assms(2) by (simp add: univ_poly_carrier) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2316 | using dense_repr_monom_closed[OF assms(1)] by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2317 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2318 | moreover | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2322 | using monom_eq_var_pow[OF assms(1)] by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2323 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2324 | ultimately show ?thesis | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2326 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2327 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2328 | corollary (in domain) hom_var_pow_finsum: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2331 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2334 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2335 | interpret UP: domain "K[X]" + A: ring A | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2337 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2338 | have const_in_carrier: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2341 | by (auto simp add: univ_poly_carrier) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2342 | hence f: "?f: set (dense_repr p) \<rightarrow> carrier (K[X])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2346 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2349 | by (auto, meson o_apply) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
69712diff
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: 
68605diff
changeset | 2354 | show ?thesis | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2355 | using A.add.finprod_cong'[OF _ h eq] hp by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2356 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2357 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2358 | corollary (in domain) determination_of_hom: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2359 | assumes "subring K R" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2363 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2364 | interpret A: ring A | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2365 | using ring_hom_ring.axioms(2)[OF assms(2)] by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2366 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2367 | fix p assume p: "p \<in> carrier (K[X])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2368 | hence | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2371 | by (auto simp add: univ_poly_carrier) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2374 | A.m_closed[OF _ A.nat_pow_closed] | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2375 | by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2376 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2377 | have eq: "\<And>t. t \<in> set (dense_repr p) \<Longrightarrow> | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2380 | by (auto simp add: univ_poly_carrier) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2381 | show "h p = g p" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2383 | using A.add.finprod_cong'[OF _ f eq] by simp | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2384 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2385 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2386 | corollary (in domain) eval_as_unique_hom: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2387 | assumes "subring K R" "x \<in> carrier R" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2388 | and "ring_hom_ring (K[X]) R h" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2393 | by fastforce | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2394 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2395 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2396 | subsection \<open>The Constant Term\<close> | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2397 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2398 | definition (in ring) const_term :: "'a list \<Rightarrow> 'a" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2399 | where "const_term p = eval p \<zero>" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2400 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2401 | lemma (in ring) const_term_eq_last: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2402 | assumes "set p \<subseteq> carrier R" and "a \<in> carrier R" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2403 | shows "const_term (p @ [ a ]) = a" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2404 | using assms by (induct p) (auto simp add: const_term_def) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2405 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2406 | lemma (in ring) const_term_not_zero: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2407 | assumes "const_term p \<noteq> \<zero>" shows "p \<noteq> []" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2408 | using assms by (auto simp add: const_term_def) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2409 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2410 | lemma (in ring) const_term_explicit: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2413 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2414 | obtain a' p' where p: "p = p' @ [ a' ]" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2415 | using assms(2) rev_exhaust by blast | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2416 | have p': "set p' \<subseteq> carrier R" and a: "a = a'" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2418 | show thesis | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2419 | using p p' that unfolding a by blast | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2420 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2421 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2422 | lemma (in ring) const_term_zero: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2425 | proof - | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2426 | obtain p' where p': "p = p' @ [ \<zero> ]" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2428 | have "polynomial K p'" "p' \<noteq> []" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2429 | using assms(2) unfolding p' polynomial_def by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2430 | thus thesis using p' .. | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2431 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2432 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2433 | lemma (in cring) const_term_simprules: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2440 | unfolding const_term_def by auto | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2441 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2442 | lemma (in domain) const_term_simprules_shell: | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2443 | assumes "subring K R" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2450 | using eval_is_hom[OF assms(1) zero_closed] | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2451 | unfolding ring_hom_def const_term_def | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2452 | proof (auto) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2453 | fix p assume p: "p \<in> carrier (K[X])" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2454 | hence "set p \<subseteq> carrier R" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
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: 
68605diff
changeset | 2457 | unfolding univ_poly_a_inv_def'[OF assms(1) p] | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2459 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2460 | have "set p \<subseteq> K" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2461 | using p by (auto simp add: univ_poly_def polynomial_def) | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2462 | thus "eval p \<zero> \<in> K" | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2463 | using subringE(1-2,6-7)[OF assms] | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
68605diff
changeset | 2465 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2466 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2467 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2468 | subsection \<open>The Canonical Embedding of K in K[X]\<close> | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2469 | |
| 70160 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2474 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2479 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2484 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
68605diff
changeset | 2487 | proof - | 
| 70160 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
changeset | 2489 | unfolding poly_of_const_def by auto | 
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2490 |   also have " ... = { p \<in> carrier ((carrier R)[X]). degree p = 0 }"
 | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2491 | unfolding univ_poly_def polynomial_def | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
70019diff
changeset | 2493 | finally show ?thesis . | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2494 | qed | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
changeset | 2495 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2501 | |
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
70019diff
changeset | 2504 | proof - | 
| 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
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: 
68605diff
changeset | 2507 | thus ?thesis | 
| 70160 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 paulson <lp15@cam.ac.uk> parents: 
70019diff
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: 
70019diff
changeset | 2509 | unfolding univ_poly_def by auto | 
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2510 | qed | 
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2511 | |
| 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
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: 
70019diff
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: 
68605diff
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: 
70019diff
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: 
70019diff
changeset | 2516 | univ_poly_consistent[OF subfieldE(1)[OF assms]] by simp | 
| 68664 
bd0df72c16d5
updated material concerning Algebra
 paulson <lp15@cam.ac.uk> parents: 
68605diff
changeset | 2517 | |
| 68583 | 2518 | end |