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