(* Title: HOL/Algebra/UnivPoly.thy Author: Clemens Ballarin, started 9 December 1996 Copyright: Clemens Ballarin
Contributions, in particular on long division, by Jesus Aransay.
*)
theory UnivPoly imports Module RingHom begin
section ‹Univariate Polynomials›
text‹
Polynomials are formalised as modules with additional operations for
extracting coefficients from polynomials andfor obtaining monomials from coefficients and exponents (record‹up_ring›). The
carrier set is a set of bounded functions from Nat to the
coefficient domain. Bounded means that these functions return zero
above a certain bound (the degree). There is a chapter on the
formalisation of polynomials in the PhD thesis 🍋‹"Ballarin:1999"›,
which was implemented with axiomatic type classes. This was later
ported to Locales. ›
subsection ‹The Constructor for Univariate Polynomials›
text‹
Functions with finite support. ›
locale bound = fixes z :: 'a and n :: nat and f :: "nat => 'a" assumes bound: "!!m. n < m \ f m = z"
declare bound.intro [intro!] and bound.bound [dest]
lemma bound_below: assumes bound: "bound z m f"and nonzero: "f n \ z"shows"n \ m" proof (rule classical) assume"\ ?thesis" thenhave"m < n"by arith with bound have"f n = z" .. with nonzero show ?thesis by contradiction qed
definition
up :: "('a, 'm) ring_scheme => (nat => 'a) set" where"up R = {f. f \ UNIV \ carrier R \ (\n. bound \\<^bsub>R\<^esub> n f)}"
definition UP :: "('a, 'm) ring_scheme => ('a, nat => 'a) up_ring" where"UP R = \
carrier = up R,
mult = (λp∈up R. λq∈up R. λn. ⨁🚫R🚫i ∈ {..n}. p i ⊗🚫R🚫 q (n-i)),
one = (λi. if i=0 then1🚫R🚫 else 0🚫R🚫),
zero = (λi. 0🚫R🚫),
add = (λp∈up R. λq∈up R. λi. p i ⊕🚫R🚫 q i),
smult = (λa∈carrier R. λp∈up R. λi. a ⊗🚫R🚫 p i),
monom = (λa∈carrier R. λn i. if i=n then a else 0🚫R🚫),
coeff = (λp∈up R. λn. p n))"
text‹
Properties of the set of polynomials 🍋‹up›. ›
lemma mem_upI [intro]: "[| \n. f n \ carrier R; \n. bound (zero R) n f |] ==> f \ up R" by (simp add: up_def Pi_def)
lemma mem_upD [dest]: "f \ up R ==> f n \ carrier R" by (simp add: up_def Pi_def)
context ring begin
lemma bound_upD [dest]: "f \ up R \ \n. bound \ n f"by (simp add: up_def)
lemma up_one_closed: "(\n. if n = 0 then \ else \) \ up R"using up_def by force
lemma up_smult_closed: "[| a \ carrier R; p \ up R |] ==> (\i. a \ p i) \ up R"by force
lemma up_add_closed: "[| p \ up R; q \ up R |] ==> (\i. p i \ q i) \ up R" proof fix n assume"p \ up R"and"q \ up R" thenshow"p n \ q n \ carrier R" by auto next assume UP: "p \ up R""q \ up R" show"\n. bound \ n (\i. p i \ q i)" proof - from UP obtain n where boundn: "bound \ n p"by fast from UP obtain m where boundm: "bound \ m q"by fast have"bound \ (max n m) (\i. p i \ q i)" proof fix i assume"max n m < i" with boundn and boundm and UP show"p i \ q i = \"by fastforce qed thenshow ?thesis .. qed qed
lemma up_a_inv_closed: "p \ up R ==> (\i. \ (p i)) \ up R" proof assume R: "p \ up R" thenobtain n where"bound \ n p"by auto thenhave"bound \ n (\i. \ p i)" by (simp add: bound_def minus_equality) thenshow"\n. bound \ n (\i. \ p i)"by auto qed auto
lemma up_minus_closed: "[| p \ up R; q \ up R |] ==> (\i. p i \ q i) \ up R" unfolding a_minus_def using mem_upD [of p R] mem_upD [of q R] up_add_closed up_a_inv_closed by auto
lemma up_mult_closed: "[| p \ up R; q \ up R |] ==>
(λn. ⨁i ∈ {..n}. p i ⊗ q (n-i)) ∈ up R" proof fix n assume"p \ up R""q \ up R" thenshow"(\i \ {..n}. p i \ q (n-i)) \ carrier R" by (simp add: mem_upD funcsetI) next assume UP: "p \ up R""q \ up R" show"\n. bound \ n (\n. \i \ {..n}. p i \ q (n-i))" proof - from UP obtain n where boundn: "bound \ n p"by fast from UP obtain m where boundm: "bound \ m q"by fast have"bound \ (n + m) (\n. \i \ {..n}. p i \ q (n - i))" proof fix k assume bound: "n + m < k"
{ fix i have"p i \ q (k-i) = \" proof (cases "n < i") case True with boundn have"p i = \"by auto moreoverfrom UP have"q (k-i) \ carrier R"by auto ultimatelyshow ?thesis by simp next case False with bound have"m < k-i"by arith with boundm have"q (k-i) = \"by auto moreoverfrom UP have"p i \ carrier R"by auto ultimatelyshow ?thesis by simp qed
} thenshow"(\i \ {..k}. p i \ q (k-i)) = \" by (simp add: Pi_def) qed thenshow ?thesis by fast qed qed
end
subsection ‹Effect of Operations on Coefficients›
locale UP = fixes R (structure) and P (structure) defines P_def: "P == UP R"
locale UP_ring = UP + R?: ring R
locale UP_cring = UP + R?: cring R
sublocale UP_cring < UP_ring by intro_locales [1] (rule P_def)
locale UP_domain = UP + R?: "domain" R
sublocale UP_domain < UP_cring by intro_locales [1] (rule P_def)
context UP begin
text‹Temporarily declare @{thm P_def} as simp rule.›
declare P_def [simp]
lemma up_eqI: assumes prem: "!!n. coeff P p n = coeff P q n"and R: "p \ carrier P""q \ carrier P" shows"p = q" proof fix x from prem and R show"p x = q x"by (simp add: UP_def) qed
lemma coeff_closed [simp]: "p \ carrier P ==> coeff P p n \ carrier R"by (auto simp add: UP_def)
end
context UP_ring begin
(* Theorems generalised from commutative rings to rings by Jesus Aransay. *)
lemma coeff_monom [simp]: "a \ carrier R ==> coeff P (monom P a m) n = (if m=n then a else \)" proof - assume R: "a \ carrier R" thenhave"(\n. if n = m then a else \) \ up R" using up_def by force with R show ?thesis by (simp add: UP_def) qed
lemma coeff_zero [simp]: "coeff P \\<^bsub>P\<^esub> n = \"by (auto simp add: UP_def)
lemma coeff_one [simp]: "coeff P \\<^bsub>P\<^esub> n = (if n=0 then \ else \)" using up_one_closed by (simp add: UP_def)
lemma coeff_smult [simp]: "[| a \ carrier R; p \ carrier P |] ==> coeff P (a \\<^bsub>P\<^esub> p) n = a \ coeff P p n" by (simp add: UP_def up_smult_closed)
lemma coeff_add [simp]: "[| p \ carrier P; q \ carrier P |] ==> coeff P (p \\<^bsub>P\<^esub> q) n = coeff P p n \ coeff P q n" by (simp add: UP_def up_add_closed)
lemma coeff_mult [simp]: "[| p \ carrier P; q \ carrier P |] ==> coeff P (p \\<^bsub>P\<^esub> q) n = (\i \ {..n}. coeff P p i \ coeff P q (n-i))" by (simp add: UP_def up_mult_closed)
end
subsection ‹Polynomials Form a Ring.›
context UP_ring begin
text‹Operations are closed over 🍋‹P›.›
lemma UP_mult_closed [simp]: "[| p \ carrier P; q \ carrier P |] ==> p \\<^bsub>P\<^esub> q \ carrier P"by (simp add: UP_def up_mult_closed)
lemma UP_l_neg_ex: assumes R: "p \ carrier P" shows"\q \ carrier P. q \\<^bsub>P\<^esub> p = \\<^bsub>P\<^esub>" proof - let ?q = "\i. \ (p i)" from R have closed: "?q \ carrier P" by (simp add: UP_def P_def up_a_inv_closed) from R have coeff: "!!n. coeff P ?q n = \ (coeff P p n)" by (simp add: UP_def P_def up_a_inv_closed) show ?thesis proof show"?q \\<^bsub>P\<^esub> p = \\<^bsub>P\<^esub>" by (auto intro!: up_eqI simp add: R closed coeff R.l_neg) qed (rule closed) qed
lemma UP_m_assoc: assumes R: "p \ carrier P""q \ carrier P""r \ carrier P" shows"(p \\<^bsub>P\<^esub> q) \\<^bsub>P\<^esub> r = p \\<^bsub>P\<^esub> (q \\<^bsub>P\<^esub> r)" proof (rule up_eqI) fix n
{ fix k and a b c :: "nat=>'a" assume R: "a \ UNIV \ carrier R""b \ UNIV \ carrier R" "c \ UNIV \ carrier R" thenhave"k <= n ==>
(⨁j ∈ {..k}. (⨁i ∈ {..j}. a i ⊗ b (j-i)) ⊗ c (n-j)) =
(⨁j ∈ {..k}. a j ⊗ (⨁i ∈ {..k-j}. b i ⊗ c (n-j-i)))"
(is"_ \ ?eq k") proof (induct k) case 0 thenshow ?caseby (simp add: Pi_def m_assoc) next case (Suc k) thenhave"k <= n"by arith from this R have"?eq k"by (rule Suc) with R show ?case by (simp cong: finsum_cong
add: Suc_diff_le Pi_def l_distr r_distr m_assoc)
(simp cong: finsum_cong add: Pi_def a_ac finsum_ldistr m_assoc) qed
} with R show"coeff P ((p \\<^bsub>P\<^esub> q) \\<^bsub>P\<^esub> r) n = coeff P (p \\<^bsub>P\<^esub> (q \\<^bsub>P\<^esub> r)) n" by (simp add: Pi_def) qed (simp_all add: R)
lemma UP_r_one [simp]: assumes R: "p \ carrier P"shows"p \\<^bsub>P\<^esub> \\<^bsub>P\<^esub> = p" proof (rule up_eqI) fix n show"coeff P (p \\<^bsub>P\<^esub> \\<^bsub>P\<^esub>) n = coeff P p n" proof (cases n) case 0
{ with R show ?thesis by simp
} next case Suc
{ (*JE: in the locale UP_cring the proof was solved only with "by (simp del: finsum_Suc add: finsum_Suc2 Pi_def)", but I did not get it to work here*) fix nn assume Succ: "n = Suc nn" have"coeff P (p \\<^bsub>P\<^esub> \\<^bsub>P\<^esub>) (Suc nn) = coeff P p (Suc nn)" proof - have"coeff P (p \\<^bsub>P\<^esub> \\<^bsub>P\<^esub>) (Suc nn) = (\i\{..Suc nn}. coeff P p i \ (if Suc nn \ i then \ else \))"using R by simp alsohave"\ = coeff P p (Suc nn) \ (if Suc nn \ Suc nn then \ else \) \ (\i\{..nn}. coeff P p i \ (if Suc nn \ i then \ else \))" using finsum_Suc [of "(\i::nat. coeff P p i \ (if Suc nn \ i then \ else \))""nn"] unfolding Pi_def using R by simp alsohave"\ = coeff P p (Suc nn) \ (if Suc nn \ Suc nn then \ else \)" proof - have"(\i\{..nn}. coeff P p i \ (if Suc nn \ i then \ else \)) = (\i\{..nn}. \)" using finsum_cong [of "{..nn}""{..nn}""(\i::nat. coeff P p i \ (if Suc nn \ i then \ else \))""(\i::nat. \)"] using R unfolding Pi_def by simp alsohave"\ = \"by simp finallyshow ?thesis using r_zero R by simp qed alsohave"\ = coeff P p (Suc nn)"using R by simp finallyshow ?thesis by simp qed thenshow ?thesis using Succ by simp
} qed qed (simp_all add: R)
lemma UP_l_one [simp]: assumes R: "p \ carrier P" shows"\\<^bsub>P\<^esub> \\<^bsub>P\<^esub> p = p" proof (rule up_eqI) fix n show"coeff P (\\<^bsub>P\<^esub> \\<^bsub>P\<^esub> p) n = coeff P p n" proof (cases n) case 0 with R show ?thesis by simp next case Suc with R show ?thesis by (simp del: finsum_Suc add: finsum_Suc2 Pi_def) qed qed (simp_all add: R)
theorem UP_ring: "ring P" by (auto intro!: ringI abelian_groupI monoidI UP_a_assoc)
(auto intro: UP_a_comm UP_l_neg_ex UP_m_assoc UP_l_distr UP_r_distr)
end
subsection ‹Polynomials Form a Commutative Ring.›
context UP_cring begin
lemma UP_m_comm: assumes R1: "p \ carrier P"and R2: "q \ carrier P"shows"p \\<^bsub>P\<^esub> q = q \\<^bsub>P\<^esub> p" proof (rule up_eqI) fix n have l: "(\i \ {..k}. a i \ b (n-i)) = (\i \ {..k}. a (k-i) \ b (i+n-k))" (is"?eq k") if"a \ UNIV \ carrier R""b \ UNIV \ carrier R"and"k <= n" for k and a b :: "nat=>'a" using that proof (induct k) case 0 thenshow ?caseby (simp add: Pi_def) next case (Suc k) thenshow ?case by (subst (2) finsum_Suc2) (simp add: Pi_def a_comm)+ qed from R1 R2 show"coeff P (p \\<^bsub>P\<^esub> q) n = coeff P (q \\<^bsub>P\<^esub> p) n" unfolding coeff_mult [OF R1 R2, of n] unfolding coeff_mult [OF R2 R1, of n] using l [of "(\i. coeff P p i)""(\i. coeff P q i)""n"] by (simp add: Pi_def m_comm) qed (simp_all add: R1 R2)
subsection ‹Polynomials over a commutative ring for a commutative ring›
lemma UP_a_inv_closed [intro, simp]: "p \ carrier P ==> \\<^bsub>P\<^esub> p \ carrier P" by (rule abelian_group.a_inv_closed [OF ring.is_abelian_group [OF UP_ring]])
lemma coeff_a_inv [simp]: assumes R: "p \ carrier P" shows"coeff P (\\<^bsub>P\<^esub> p) n = \ (coeff P p n)" proof - from R coeff_closed UP_a_inv_closed have "coeff P (\\<^bsub>P\<^esub> p) n = \ coeff P p n \ (coeff P p n \ coeff P (\\<^bsub>P\<^esub> p) n)" by algebra alsofrom R have"... = \ (coeff P p n)" by (simp del: coeff_add add: coeff_add [THEN sym]
abelian_group.r_neg [OF ring.is_abelian_group [OF UP_ring]]) finallyshow ?thesis . qed
end
sublocale UP_ring < P?: ring P using UP_ring .
sublocale UP_cring < P?: cring P using UP_cring .
subsection ‹Polynomials Form an Algebra›
context UP_ring begin
lemma UP_smult_l_distr: "[| a \ carrier R; b \ carrier R; p \ carrier P |] ==>
(a ⊕ b) ⊙🚫P🚫 p = a ⊙🚫P🚫 p ⊕🚫P🚫 b ⊙🚫P🚫 p" by (rule up_eqI) (simp_all add: R.l_distr)
lemma UP_smult_r_distr: "[| a \ carrier R; p \ carrier P; q \ carrier P |] ==>
a ⊙🚫P🚫 (p ⊕🚫P🚫 q) = a ⊙🚫P🚫 p ⊕🚫P🚫 a ⊙🚫P🚫 q" by (rule up_eqI) (simp_all add: R.r_distr)
lemma UP_smult_assoc1: "[| a \ carrier R; b \ carrier R; p \ carrier P |] ==>
(a ⊗ b) ⊙🚫P🚫 p = a ⊙🚫P🚫 (b ⊙🚫P🚫 p)" by (rule up_eqI) (simp_all add: R.m_assoc)
lemma UP_smult_zero [simp]: "p \ carrier P ==> \ \\<^bsub>P\<^esub> p = \\<^bsub>P\<^esub>" by (rule up_eqI) simp_all
lemma UP_smult_one [simp]: "p \ carrier P ==> \ \\<^bsub>P\<^esub> p = p" by (rule up_eqI) simp_all
lemma UP_smult_assoc2: "[| a \ carrier R; p \ carrier P; q \ carrier P |] ==>
(a ⊙🚫P🚫 p) ⊗🚫P🚫 q = a ⊙🚫P🚫 (p ⊗🚫P🚫 q)" by (rule up_eqI) (simp_all add: R.finsum_rdistr R.m_assoc Pi_def)
end
text‹ Interpretation of lemmasfrom🍋‹algebra›. ›
lemma (in UP_cring) UP_algebra: "algebra R P"by (auto intro!: algebraI R.cring_axioms UP_cring UP_smult_l_distr UP_smult_r_distr
UP_smult_assoc1 UP_smult_assoc2)
sublocale UP_cring < algebra R P using UP_algebra .
subsection ‹Further Lemmas Involving Monomials›
context UP_ring begin
lemma monom_zero [simp]: "monom P \ n = \\<^bsub>P\<^esub>"by (simp add: UP_def P_def)
lemma monom_mult_is_smult: assumes R: "a \ carrier R""p \ carrier P" shows"monom P a 0 \\<^bsub>P\<^esub> p = a \\<^bsub>P\<^esub> p" proof (rule up_eqI) fix n show"coeff P (monom P a 0 \\<^bsub>P\<^esub> p) n = coeff P (a \\<^bsub>P\<^esub> p) n" proof (cases n) case 0 with R show ?thesis by simp next case Suc with R show ?thesis using R.finsum_Suc2 by (simp del: R.finsum_Suc add: Pi_def) qed qed (simp_all add: R)
lemma monom_one [simp]: "monom P \ 0 = \\<^bsub>P\<^esub>" by (rule up_eqI) simp_all
lemma monom_add [simp]: "[| a \ carrier R; b \ carrier R |] ==>
monom P (a ⊕ b) n = monom P a n ⊕🚫P🚫 monom P b n" by (rule up_eqI) simp_all
lemma monom_one_Suc: "monom P \ (Suc n) = monom P \ n \\<^bsub>P\<^esub> monom P \ 1" proof (rule up_eqI) fix k show"coeff P (monom P \ (Suc n)) k = coeff P (monom P \ n \\<^bsub>P\<^esub> monom P \ 1) k" proof (cases "k = Suc n") case True show ?thesis proof - fix m from True have less_add_diff: "!!i. [| n < i; i <= n + m |] ==> n + m - i < m"by arith from True have"coeff P (monom P \ (Suc n)) k = \"by simp alsofrom True have"... = (\i \ {.. {n}. coeff P (monom P \ n) i \
coeff P (monom P 1 1) (k - i))" by (simp cong: R.finsum_cong add: Pi_def) alsohave"... = (\i \ {..n}. coeff P (monom P \ n) i \
coeff P (monom P 1 1) (k - i))" by (simp only: ivl_disj_un_singleton) alsofrom True have"... = (\i \ {..n} \ {n<..k}. coeff P (monom P \ n) i \
coeff P (monom P 1 1) (k - i))" by (simp cong: R.finsum_cong add: R.finsum_Un_disjoint ivl_disj_int_one
order_less_imp_not_eq Pi_def) alsofrom True have"... = coeff P (monom P \ n \\<^bsub>P\<^esub> monom P \ 1) k" by (simp add: ivl_disj_un_one) finallyshow ?thesis . qed next case False note neq = False let ?s = "\i. (if n = i then \ else \) \ (if Suc 0 = k - i then \ else \)" from neq have"coeff P (monom P \ (Suc n)) k = \"by simp alsohave"... = (\i \ {..k}. ?s i)" proof - have f1: "(\i \ {.." by (simp cong: R.finsum_cong add: Pi_def) from neq have f2: "(\i \ {n}. ?s i) = \" by (simp cong: R.finsum_cong add: Pi_def) arith have f3: "n < k ==> (\i \ {n<..k}. ?s i) = \" by (simp cong: R.finsum_cong add: order_less_imp_not_eq Pi_def) show ?thesis proof (cases "k < n") case True thenshow ?thesis by (simp cong: R.finsum_cong add: Pi_def) next case False thenhave n_le_k: "n <= k"by arith show ?thesis proof (cases "n = k") case True thenhave"\ = (\i \ {.. {n}. ?s i)" by (simp cong: R.finsum_cong add: Pi_def) alsofrom True have"... = (\i \ {..k}. ?s i)" by (simp only: ivl_disj_un_singleton) finallyshow ?thesis . next case False with n_le_k have n_less_k: "n < k"by arith with neq have"\ = (\i \ {.. {n}. ?s i)" by (simp add: R.finsum_Un_disjoint f1 f2 Pi_def del: Un_insert_right) alsohave"... = (\i \ {..n}. ?s i)" by (simp only: ivl_disj_un_singleton) alsofrom n_less_k neq have"... = (\i \ {..n} \ {n<..k}. ?s i)" by (simp add: R.finsum_Un_disjoint f3 ivl_disj_int_one Pi_def) alsofrom n_less_k have"... = (\i \ {..k}. ?s i)" by (simp only: ivl_disj_un_one) finallyshow ?thesis . qed qed qed alsohave"... = coeff P (monom P \ n \\<^bsub>P\<^esub> monom P \ 1) k"by simp finallyshow ?thesis . qed qed (simp_all)
lemma monom_one_Suc2: "monom P \ (Suc n) = monom P \ 1 \\<^bsub>P\<^esub> monom P \ n" proof (induct n) case 0 show ?caseby simp next case Suc
{ fix k:: nat assume hypo: "monom P \ (Suc k) = monom P \ 1 \\<^bsub>P\<^esub> monom P \ k" thenshow"monom P \ (Suc (Suc k)) = monom P \ 1 \\<^bsub>P\<^esub> monom P \ (Suc k)" proof - have lhs: "monom P \ (Suc (Suc k)) = monom P \ 1 \\<^bsub>P\<^esub> monom P \ k \\<^bsub>P\<^esub> monom P \ 1" unfolding monom_one_Suc [of "Suc k"] unfolding hypo .. note cl = monom_closed [OF R.one_closed, of 1] note clk = monom_closed [OF R.one_closed, of k] have rhs: "monom P \ 1 \\<^bsub>P\<^esub> monom P \ (Suc k) = monom P \ 1 \\<^bsub>P\<^esub> monom P \ k \\<^bsub>P\<^esub> monom P \ 1" unfolding monom_one_Suc [of k] unfolding sym [OF m_assoc [OF cl clk cl]] .. from lhs rhs show ?thesis by simp qed
} qed
text‹The following corollary follows fromlemmas @{thm"monom_one_Suc"} and @{thm"monom_one_Suc2"}, andis trivial in🍋‹UP_cring››
corollary monom_one_comm: shows"monom P \ k \\<^bsub>P\<^esub> monom P \ 1 = monom P \ 1 \\<^bsub>P\<^esub> monom P \ k" unfolding monom_one_Suc [symmetric] monom_one_Suc2 [symmetric] ..
lemma monom_mult_smult: "[| a \ carrier R; b \ carrier R |] ==> monom P (a \ b) n = a \\<^bsub>P\<^esub> monom P b n" by (rule up_eqI) simp_all
lemma monom_one_mult: "monom P \ (n + m) = monom P \ n \\<^bsub>P\<^esub> monom P \ m" proof (induct n) case 0 show ?caseby simp next case Suc thenshow ?case unfolding add_Suc unfolding monom_one_Suc unfolding Suc.hyps using m_assoc monom_one_comm [of m] by simp qed
lemma monom_one_mult_comm: "monom P \ n \\<^bsub>P\<^esub> monom P \ m = monom P \ m \\<^bsub>P\<^esub> monom P \ n" unfolding monom_one_mult [symmetric] by (rule up_eqI) simp_all
lemma monom_mult [simp]: assumes a_in_R: "a \ carrier R"and b_in_R: "b \ carrier R" shows"monom P (a \ b) (n + m) = monom P a n \\<^bsub>P\<^esub> monom P b m" proof (rule up_eqI) fix k show"coeff P (monom P (a \ b) (n + m)) k = coeff P (monom P a n \\<^bsub>P\<^esub> monom P b m) k" proof (cases "n + m = k") case True
{ show ?thesis unfolding True [symmetric]
coeff_mult [OF monom_closed [OF a_in_R, of n] monom_closed [OF b_in_R, of m], of "n + m"]
coeff_monom [OF a_in_R, of n] coeff_monom [OF b_in_R, of m] using R.finsum_cong [of "{.. n + m}""{.. n + m}""(\i. (if n = i then a else \) \ (if m = n + m - i then b else \))" "(\i. if n = i then a \ b else \)"]
a_in_R b_in_R unfolding simp_implies_def using R.finsum_singleton [of n "{.. n + m}""(\i. a \ b)"] unfolding Pi_def by auto
} next case False
{ show ?thesis unfolding coeff_monom [OF R.m_closed [OF a_in_R b_in_R], of "n + m" k] apply (simp add: False) unfolding coeff_mult [OF monom_closed [OF a_in_R, of n] monom_closed [OF b_in_R, of m], of k] unfolding coeff_monom [OF a_in_R, of n] unfolding coeff_monom [OF b_in_R, of m] using False using R.finsum_cong [of "{..k}""{..k}""(\i. (if n = i then a else \) \ (if m = k - i then b else \))""(\i. \)"] unfolding Pi_def simp_implies_def using a_in_R b_in_R by force
} qed qed (simp_all add: a_in_R b_in_R)
lemma monom_a_inv [simp]: "a \ carrier R ==> monom P (\ a) n = \\<^bsub>P\<^esub> monom P a n" by (rule up_eqI) auto
lemma monom_inj: "inj_on (\a. monom P a n) (carrier R)" proof (rule inj_onI) fix x y assume R: "x \ carrier R""y \ carrier R"and eq: "monom P x n = monom P y n" thenhave"coeff P (monom P x n) n = coeff P (monom P y n) n"by simp with R show"x = y"by simp qed
end
subsection ‹The Degree Function›
definition
deg :: "[('a, 'm) ring_scheme, nat => 'a] => nat" where"deg R p = (LEAST n. bound \\<^bsub>R\<^esub> n (coeff (UP R) p))"
context UP_ring begin
lemma deg_aboveI: "[| (!!m. n < m ==> coeff P p m = \); p \ carrier P |] ==> deg R p <= n" by (unfold deg_def P_def) (fast intro: Least_le)
(* lemma coeff_bound_ex: "EX n. bound n (coeff p)" proof - have "(\<lambda>n. coeff p n) : UP" by (simp add: coeff_def Rep_UP) then obtain n where "bound n (coeff p)" by (unfold UP_def) fast then show ?thesis .. qed
lemma bound_coeff_obtain: assumes prem: "(!!n. bound n (coeff p) ==> P)" shows "P" proof - have "(\<lambda>n. coeff p n) : UP" by (simp add: coeff_def Rep_UP) then obtain n where "bound n (coeff p)" by (unfold UP_def) fast with prem show P . qed
*)
lemma deg_aboveD: assumes"deg R p < m"and"p \ carrier P" shows"coeff P p m = \" proof - from‹p ∈ carrier P›obtain n where"bound \ n (coeff P p)" by (auto simp add: UP_def P_def) thenhave"bound \ (deg R p) (coeff P p)" by (auto simp: deg_def P_def dest: LeastI) from this and‹deg R p < m›show ?thesis .. qed
lemma deg_belowI: assumes non_zero: "n \ 0 \ coeff P p n \ \" and R: "p \ carrier P" shows"n \ deg R p" 🍋‹Logically, this is a slightly stronger version of
@{thm [source] deg_aboveD}› proof (cases "n=0") case True thenshow ?thesis by simp next case False thenhave"coeff P p n \ \"by (rule non_zero) thenhave"\ deg R p < n"by (fast dest: deg_aboveD intro: R) thenshow ?thesis by arith qed
lemma lcoeff_nonzero_deg: assumes deg: "deg R p \ 0"and R: "p \ carrier P" shows"coeff P p (deg R p) \ \" proof - from R obtain m where"deg R p \ m"and m_coeff: "coeff P p m \ \" proof - have minus: "\(n::nat) m. n \ 0 \ (n - Suc 0 < m) = (n \ m)" by arith from deg have"deg R p - 1 < (LEAST n. bound \ n (coeff P p))" by (unfold deg_def P_def) simp thenhave"\ bound \ (deg R p - 1) (coeff P p)"by (rule not_less_Least) thenhave"\m. deg R p - 1 < m \ coeff P p m \ \" by (unfold bound_def) fast thenhave"\m. deg R p \ m \ coeff P p m \ \"by (simp add: deg minus) thenshow ?thesis by (auto intro: that) qed with deg_belowI R have"deg R p = m"by fastforce with m_coeff show ?thesis by simp qed
lemma lcoeff_nonzero_nonzero: assumes deg: "deg R p = 0"and nonzero: "p \ \\<^bsub>P\<^esub>"and R: "p \ carrier P" shows"coeff P p 0 \ \" proof - have"\m. coeff P p m \ \" proof (rule classical) assume"\ ?thesis" with R have"p = \\<^bsub>P\<^esub>"by (auto intro: up_eqI) with nonzero show ?thesis by contradiction qed thenobtain m where coeff: "coeff P p m \ \" .. from this and R have"m \ deg R p"by (rule deg_belowI) thenhave"m = 0"by (simp add: deg) with coeff show ?thesis by simp qed
lemma lcoeff_nonzero: assumes neq: "p \ \\<^bsub>P\<^esub>"and R: "p \ carrier P" shows"coeff P p (deg R p) \ \" proof (cases "deg R p = 0") case True with neq R show ?thesis by (simp add: lcoeff_nonzero_nonzero) next case False with neq R show ?thesis by (simp add: lcoeff_nonzero_deg) qed
lemma deg_eqI: "[| \m. n < m \ coeff P p m = \; ∧n. n ≠ 0 ==> coeff P p n ≠0; p ∈ carrier P |] ==> deg R p = n" by (fast intro: le_antisym deg_aboveI deg_belowI)
text‹Degree and polynomial operations›
lemma deg_add [simp]: "p \ carrier P \ q \ carrier P \
deg R (p ⊕🚫P🚫 q) ≤ max (deg R p) (deg R q)" by(rule deg_aboveI)(simp_all add: deg_aboveD)
lemma deg_monom_le: "a \ carrier R \ deg R (monom P a n) \ n" by (intro deg_aboveI) simp_all
lemma deg_monom [simp]: "[| a \ \; a \ carrier R |] ==> deg R (monom P a n) = n" by (fastforce intro: le_antisym deg_aboveI deg_belowI)
lemma deg_const [simp]: assumes R: "a \ carrier R"shows"deg R (monom P a 0) = 0" proof (rule le_antisym) show"deg R (monom P a 0) \ 0"by (rule deg_aboveI) (simp_all add: R) next show"0 \ deg R (monom P a 0)"by (rule deg_belowI) (simp_all add: R) qed
lemma deg_zero [simp]: "deg R \\<^bsub>P\<^esub> = 0" proof (rule le_antisym) show"deg R \\<^bsub>P\<^esub> \ 0"by (rule deg_aboveI) simp_all next show"0 \ deg R \\<^bsub>P\<^esub>"by (rule deg_belowI) simp_all qed
lemma deg_one [simp]: "deg R \\<^bsub>P\<^esub> = 0" proof (rule le_antisym) show"deg R \\<^bsub>P\<^esub> \ 0"by (rule deg_aboveI) simp_all next show"0 \ deg R \\<^bsub>P\<^esub>"by (rule deg_belowI) simp_all qed
lemma deg_uminus [simp]: assumes R: "p \ carrier P"shows"deg R (\\<^bsub>P\<^esub> p) = deg R p" proof (rule le_antisym) show"deg R (\\<^bsub>P\<^esub> p) \ deg R p"by (simp add: deg_aboveI deg_aboveD R) next show"deg R p \ deg R (\\<^bsub>P\<^esub> p)" by (simp add: deg_belowI lcoeff_nonzero_deg
inj_on_eq_iff [OF R.a_inv_inj, of _ "\", simplified] R) qed
text‹The following lemmais later \emph{overwritten} by the most
specific one for domains, ‹deg_smult›.›
lemma deg_smult_ring [simp]: "[| a \ carrier R; p \ carrier P |] ==>
deg R (a ⊙🚫P🚫 p) ≤ (if a = 0then 0 else deg R p)" by (cases "a = \") (simp add: deg_aboveI deg_aboveD)+
end
context UP_domain begin
lemma deg_smult [simp]: assumes R: "a \ carrier R""p \ carrier P" shows"deg R (a \\<^bsub>P\<^esub> p) = (if a = \ then 0 else deg R p)" proof (rule le_antisym) show"deg R (a \\<^bsub>P\<^esub> p) \ (if a = \ then 0 else deg R p)" using R by (rule deg_smult_ring) next show"(if a = \ then 0 else deg R p) \ deg R (a \\<^bsub>P\<^esub> p)" proof (cases "a = \") qed (simp, simp add: deg_belowI lcoeff_nonzero_deg integral_iff R) qed
end
context UP_ring begin
lemma deg_mult_ring: assumes R: "p \ carrier P""q \ carrier P" shows"deg R (p \\<^bsub>P\<^esub> q) \ deg R p + deg R q" proof (rule deg_aboveI) fix m assume boundm: "deg R p + deg R q < m"
{ fix k i assume boundk: "deg R p + deg R q < k" thenhave"coeff P p i \ coeff P q (k - i) = \" proof (cases "deg R p < i") case True thenshow ?thesis by (simp add: deg_aboveD R) next case False with boundk have"deg R q < k - i"by arith thenshow ?thesis by (simp add: deg_aboveD R) qed
} with boundm R show"coeff P (p \\<^bsub>P\<^esub> q) m = \"by simp qed (simp add: R)
end
context UP_domain begin
lemma deg_mult [simp]: "[| p \ \\<^bsub>P\<^esub>; q \ \\<^bsub>P\<^esub>; p \ carrier P; q \ carrier P |] ==>
deg R (p ⊗🚫P🚫 q) = deg R p + deg R q" proof (rule le_antisym) assume"p \ carrier P"" q \ carrier P" thenshow"deg R (p \\<^bsub>P\<^esub> q) \ deg R p + deg R q"by (rule deg_mult_ring) next let ?s = "(\i. coeff P p i \ coeff P q (deg R p + deg R q - i))" assume R: "p \ carrier P""q \ carrier P"and nz: "p \ \\<^bsub>P\<^esub>""q \ \\<^bsub>P\<^esub>" have less_add_diff: "!!(k::nat) n m. k < n ==> m < n + m - k"by arith show"deg R p + deg R q \ deg R (p \\<^bsub>P\<^esub> q)" proof (rule deg_belowI, simp add: R) have"(\i \ {.. deg R p + deg R q}. ?s i)
= (⨁i ∈ {..< deg R p} ∪ {deg R p .. deg R p + deg R q}. ?s i)" by (simp only: ivl_disj_un_one) alsohave"... = (\i \ {deg R p .. deg R p + deg R q}. ?s i)" by (simp cong: R.finsum_cong add: R.finsum_Un_disjoint ivl_disj_int_one
deg_aboveD less_add_diff R Pi_def) alsohave"...= (\i \ {deg R p} \ {deg R p <.. deg R p + deg R q}. ?s i)" by (simp only: ivl_disj_un_singleton) alsohave"... = coeff P p (deg R p) \ coeff P q (deg R q)" by (simp cong: R.finsum_cong add: deg_aboveD R Pi_def) finallyhave"(\i \ {.. deg R p + deg R q}. ?s i)
= coeff P p (deg R p) ⊗ coeff P q (deg R q)" . with nz show"(\i \ {.. deg R p + deg R q}. ?s i) \ \" by (simp add: integral_iff lcoeff_nonzero R) qed (simp add: R) qed
end
text‹The following lemmasalso can be lifted to🍋‹UP_ring›.›
context UP_ring begin
lemma coeff_finsum: assumes fin: "finite A" shows"p \ A \ carrier P ==>
coeff P (finsum P p A) k = (⨁i ∈ A. coeff P (p i) k)" using fin by induct (auto simp: Pi_def)
lemma up_repr: assumes R: "p \ carrier P" shows"(\\<^bsub>P\<^esub> i \ {..deg R p}. monom P (coeff P p i) i) = p" proof (rule up_eqI) let ?s = "(\i. monom P (coeff P p i) i)" fix k from R have RR: "!!i. (if i = k then coeff P p i else \) \ carrier R" by simp show"coeff P (\\<^bsub>P\<^esub> i \ {..deg R p}. ?s i) k = coeff P p k" proof (cases "k \ deg R p") case True hence"coeff P (\\<^bsub>P\<^esub> i \ {..deg R p}. ?s i) k =
coeff P (⨁🚫P🚫 i ∈ {..k} ∪ {k<..deg R p}. ?s i) k" by (simp only: ivl_disj_un_one) alsofrom True have"... = coeff P (\\<^bsub>P\<^esub> i \ {..k}. ?s i) k" by (simp cong: R.finsum_cong add: R.finsum_Un_disjoint
ivl_disj_int_one order_less_imp_not_eq2 coeff_finsum R RR Pi_def) also have"... = coeff P (\\<^bsub>P\<^esub> i \ {.. {k}. ?s i) k" by (simp only: ivl_disj_un_singleton) alsohave"... = coeff P p k" by (simp cong: R.finsum_cong add: coeff_finsum deg_aboveD R RR Pi_def) finallyshow ?thesis . next case False hence"coeff P (\\<^bsub>P\<^esub> i \ {..deg R p}. ?s i) k =
coeff P (⨁🚫P🚫 i ∈ {..<deg R p} ∪ {deg R p}. ?s i) k" by (simp only: ivl_disj_un_singleton) alsofrom False have"... = coeff P p k" by (simp cong: R.finsum_cong add: coeff_finsum deg_aboveD R Pi_def) finallyshow ?thesis . qed qed (simp_all add: R Pi_def)
lemma up_repr_le: "[| deg R p <= n; p \ carrier P |] ==>
(⨁🚫P🚫 i ∈ {..n}. monom P (coeff P p i) i) = p" proof - let ?s = "(\i. monom P (coeff P p i) i)" assume R: "p \ carrier P"and"deg R p <= n" thenhave"finsum P ?s {..n} = finsum P ?s ({..deg R p} \ {deg R p<..n})" by (simp only: ivl_disj_un_one) alsohave"... = finsum P ?s {..deg R p}" by (simp cong: P.finsum_cong add: P.finsum_Un_disjoint ivl_disj_int_one
deg_aboveD R Pi_def) alsohave"... = p"using R by (rule up_repr) finallyshow ?thesis . qed
end
subsection ‹Polynomials over Integral Domains›
lemma domainI: assumes cring: "cring R" and one_not_zero: "one R \ zero R" and integral: "\a b. [| mult R a b = zero R; a \ carrier R;
b ∈ carrier R |] ==> a = zero R ∨ b = zero R" shows"domain R" by (auto intro!: domain.intro domain_axioms.intro cring.axioms assms
del: disjCI)
context UP_domain begin
lemma UP_one_not_zero: "\\<^bsub>P\<^esub> \ \\<^bsub>P\<^esub>" proof assume"\\<^bsub>P\<^esub> = \\<^bsub>P\<^esub>" hence"coeff P \\<^bsub>P\<^esub> 0 = (coeff P \\<^bsub>P\<^esub> 0)"by simp hence"\ = \"by simp with R.one_not_zero show"False"by contradiction qed
lemma UP_integral: "[| p \\<^bsub>P\<^esub> q = \\<^bsub>P\<^esub>; p \ carrier P; q \ carrier P |] ==> p = \\<^bsub>P\<^esub> \ q = \\<^bsub>P\<^esub>" proof - fix p q assume pq: "p \\<^bsub>P\<^esub> q = \\<^bsub>P\<^esub>"and R: "p \ carrier P""q \ carrier P" show"p = \\<^bsub>P\<^esub> \ q = \\<^bsub>P\<^esub>" proof (rule classical) assume c: "\ (p = \\<^bsub>P\<^esub> \ q = \\<^bsub>P\<^esub>)" with R have"deg R p + deg R q = deg R (p \\<^bsub>P\<^esub> q)"by simp alsofrom pq have"... = 0"by simp finallyhave"deg R p + deg R q = 0" . thenhave f1: "deg R p = 0 \ deg R q = 0"by simp from f1 R have"p = (\\<^bsub>P\<^esub> i \ {..0}. monom P (coeff P p i) i)" by (simp only: up_repr_le) alsofrom R have"... = monom P (coeff P p 0) 0"by simp finallyhave p: "p = monom P (coeff P p 0) 0" . from f1 R have"q = (\\<^bsub>P\<^esub> i \ {..0}. monom P (coeff P q i) i)" by (simp only: up_repr_le) alsofrom R have"... = monom P (coeff P q 0) 0"by simp finallyhave q: "q = monom P (coeff P q 0) 0" . from R have"coeff P p 0 \ coeff P q 0 = coeff P (p \\<^bsub>P\<^esub> q) 0"by simp alsofrom pq have"... = \"by simp finallyhave"coeff P p 0 \ coeff P q 0 = \" . with R have"coeff P p 0 = \ \ coeff P q 0 = \" by (simp add: R.integral_iff) with p q show"p = \\<^bsub>P\<^esub> \ q = \\<^bsub>P\<^esub>"by fastforce qed qed
sublocale UP_domain < "domain" P by intro_locales (rule domain.axioms UP_domain)+
subsection ‹The Evaluation Homomorphism and Universal Property›
(* alternative congruence rule (possibly more efficient) lemma (in abelian_monoid) finsum_cong2: "[| !!i. i \<in> A ==> f i \<in> carrier G = True; A = B; !!i. i \<in> B ==> f i = g i |] ==> finsum G f A = finsum G g B"
sorry*)
lemma (in abelian_monoid) boundD_carrier: "[| bound \ n f; n < m |] ==> f m \ carrier G" by auto
context ring begin
theorem diagonal_sum: "[| f \ {..n + m::nat} \ carrier R; g \ {..n + m} \ carrier R |] ==>
(⨁k ∈ {..n + m}. ⨁i ∈ {..k}. f i ⊗ g (k - i)) =
(⨁k ∈ {..n + m}. ⨁i ∈ {..n + m - k}. f k ⊗ g i)" proof - assume Rf: "f \ {..n + m} \ carrier R"and Rg: "g \ {..n + m} \ carrier R"
{ fix j have"j <= n + m ==>
(⨁k ∈ {..j}. ⨁i ∈ {..k}. f i ⊗ g (k - i)) =
(⨁k ∈ {..j}. ⨁i ∈ {..j - k}. f k ⊗ g i)" proof (induct j) case 0 from Rf Rg show ?caseby (simp add: Pi_def) next case (Suc j) have R6: "!!i k. [| k <= j; i <= Suc j - k |] ==> g i \ carrier R" using Suc by (auto intro!: funcset_mem [OF Rg]) have R8: "!!i k. [| k <= Suc j; i <= k |] ==> g (k - i) \ carrier R" using Suc by (auto intro!: funcset_mem [OF Rg]) have R9: "!!i k. [| k <= Suc j |] ==> f k \ carrier R" using Suc by (auto intro!: funcset_mem [OF Rf]) have R10: "!!i k. [| k <= Suc j; i <= Suc j - k |] ==> g i \ carrier R" using Suc by (auto intro!: funcset_mem [OF Rg]) have R11: "g 0 \ carrier R" using Suc by (auto intro!: funcset_mem [OF Rg]) from Suc show ?case by (simp cong: finsum_cong add: Suc_diff_le a_ac
Pi_def R6 R8 R9 R10 R11) qed
} thenshow ?thesis by fast qed
theorem cauchy_product: assumes bf: "bound \ n f"and bg: "bound \ m g" and Rf: "f \ {..n} \ carrier R"and Rg: "g \ {..m} \ carrier R" shows"(\k \ {..n + m}. \i \ {..k}. f i \ g (k - i)) =
(⨁i ∈ {..n}. f i) ⊗ (⨁i ∈ {..m}. g i)" (* State reverse direction? *) proof - have f: "!!x. f x \ carrier R" proof - fix x show"f x \ carrier R" using Rf bf boundD_carrier by (cases "x <= n") (auto simp: Pi_def) qed have g: "!!x. g x \ carrier R" proof - fix x show"g x \ carrier R" using Rg bg boundD_carrier by (cases "x <= m") (auto simp: Pi_def) qed from f g have"(\k \ {..n + m}. \i \ {..k}. f i \ g (k - i)) =
(⨁k ∈ {..n + m}. ⨁i ∈ {..n + m - k}. f k ⊗ g i)" by (simp add: diagonal_sum Pi_def) alsohave"... = (\k \ {..n} \ {n<..n + m}. \i \ {..n + m - k}. f k \ g i)" by (simp only: ivl_disj_un_one) alsofrom f g have"... = (\k \ {..n}. \i \ {..n + m - k}. f k \ g i)" by (simp cong: finsum_cong
add: bound.bound [OF bf] finsum_Un_disjoint ivl_disj_int_one Pi_def) alsofrom f g have"... = (\k \ {..n}. \i \ {..m} \ {m<..n + m - k}. f k \ g i)" by (simp cong: finsum_cong add: ivl_disj_un_one le_add_diff Pi_def) alsofrom f g have"... = (\k \ {..n}. \i \ {..m}. f k \ g i)" by (simp cong: finsum_cong
add: bound.bound [OF bg] finsum_Un_disjoint ivl_disj_int_one Pi_def) alsofrom f g have"... = (\i \ {..n}. f i) \ (\i \ {..m}. g i)" by (simp add: finsum_ldistr diagonal_sum Pi_def,
simp cong: finsum_cong add: finsum_rdistr Pi_def) finallyshow ?thesis . qed
end
lemma (in UP_ring) const_ring_hom: "(\a. monom P a 0) \ ring_hom R P" by (auto intro!: ring_hom_memI intro: up_eqI simp: monom_mult_is_smult)
definition
eval :: "[('a, 'm) ring_scheme, ('b, 'n) ring_scheme, 'a => 'b, 'b, nat => 'a] => 'b" where"eval R S phi s = (\p \ carrier (UP R). ⨁🚫S🚫i ∈ {..deg R p}. phi (coeff (UP R) p i) ⊗🚫S🚫 s [^]🚫S🚫 i)"
context UP begin
lemma eval_on_carrier: fixes S (structure) shows"p \ carrier P ==>
eval R S phi s p = (⨁🚫S🚫 i ∈ {..deg R p}. phi (coeff P p i) ⊗🚫S🚫 s [^]🚫S🚫 i)" by (unfold eval_def, fold P_def) simp
lemma eval_extensional: "eval R S phi p \ extensional (carrier P)" by (unfold eval_def, fold P_def) simp
end
text‹The universal property of the polynomial ring›
locale UP_univ_prop = UP_pre_univ_prop + fixes s and Eval assumes indet_img_carrier [simp, intro]: "s \ carrier S" defines Eval_def: "Eval == eval R S h s"
text‹JE: I have moved the following lemmafrom Ring.thy and lifted thento the locale🍋‹ring_hom_ring›from🍋‹ring_hom_cring›.› text‹JE: I was considering using it in‹eval_ring_hom›, but that property does not hold for non commutative rings, so
maybe it is not that necessary.›
lemma (in ring_hom_ring) hom_finsum [simp]: "f \ A \ carrier R \
h (finsum R f A) = finsum S (h ∘ f) A" by (induct A rule: infinite_finite_induct, auto simp: Pi_def)
context UP_pre_univ_prop begin
theorem eval_ring_hom: assumes S: "s \ carrier S" shows"eval R S h s \ ring_hom P S" proof (rule ring_hom_memI) fix p assume R: "p \ carrier P" thenshow"eval R S h s p \ carrier S" by (simp only: eval_on_carrier) (simp add: S Pi_def) next fix p q assume R: "p \ carrier P""q \ carrier P" thenshow"eval R S h s (p \\<^bsub>P\<^esub> q) = eval R S h s p \\<^bsub>S\<^esub> eval R S h s q" proof (simp only: eval_on_carrier P.a_closed) from S R have "(\\<^bsub>S \<^esub>i\{..deg R (p \\<^bsub>P\<^esub> q)}. h (coeff P (p \\<^bsub>P\<^esub> q) i) \\<^bsub>S\<^esub> s [^]\<^bsub>S\<^esub> i) =
(⨁🚫S 🚫i∈{..deg R (p ⊕🚫P🚫 q)} ∪ {deg R (p ⊕🚫P🚫 q)<..max (deg R p) (deg R q)}.
h (coeff P (p ⊕🚫P🚫 q) i) ⊗🚫S🚫 s [^]🚫S🚫 i)" by (simp cong: S.finsum_cong
add: deg_aboveD S.finsum_Un_disjoint ivl_disj_int_one Pi_def del: coeff_add) alsofrom R have"... =
(⨁🚫S🚫 i ∈ {..max (deg R p) (deg R q)}.
h (coeff P (p ⊕🚫P🚫 q) i) ⊗🚫S🚫 s [^]🚫S🚫 i)" by (simp add: ivl_disj_un_one) alsofrom R S have"... =
(⨁🚫S🚫i∈{..max (deg R p) (deg R q)}. h (coeff P p i) ⊗🚫S🚫 s [^]🚫S🚫 i) ⊕🚫S🚫
(⨁🚫S🚫i∈{..max (deg R p) (deg R q)}. h (coeff P q i) ⊗🚫S🚫 s [^]🚫S🚫 i)" by (simp cong: S.finsum_cong
add: S.l_distr deg_aboveD ivl_disj_int_one Pi_def) alsohave"... =
(⨁🚫S🚫 i ∈ {..deg R p} ∪ {deg R p<..max (deg R p) (deg R q)}.
h (coeff P p i) ⊗🚫S🚫 s [^]🚫S🚫 i) ⊕🚫S🚫
(⨁🚫S🚫 i ∈ {..deg R q} ∪ {deg R q<..max (deg R p) (deg R q)}.
h (coeff P q i) ⊗🚫S🚫 s [^]🚫S🚫 i)" by (simp only: ivl_disj_un_one max.cobounded1 max.cobounded2) alsofrom R S have"... =
(⨁🚫S🚫 i ∈ {..deg R p}. h (coeff P p i) ⊗🚫S🚫 s [^]🚫S🚫 i) ⊕🚫S🚫
(⨁🚫S🚫 i ∈ {..deg R q}. h (coeff P q i) ⊗🚫S🚫 s [^]🚫S🚫 i)" by (simp cong: S.finsum_cong
add: deg_aboveD S.finsum_Un_disjoint ivl_disj_int_one Pi_def) finallyshow "(\\<^bsub>S\<^esub>i \ {..deg R (p \\<^bsub>P\<^esub> q)}. h (coeff P (p \\<^bsub>P\<^esub> q) i) \\<^bsub>S\<^esub> s [^]\<^bsub>S\<^esub> i) =
(⨁🚫S🚫i ∈ {..deg R p}. h (coeff P p i) ⊗🚫S🚫 s [^]🚫S🚫 i) ⊕🚫S🚫
(⨁🚫S🚫i ∈ {..deg R q}. h (coeff P q i) ⊗🚫S🚫 s [^]🚫S🚫 i)" . qed next show"eval R S h s \\<^bsub>P\<^esub> = \\<^bsub>S\<^esub>" by (simp only: eval_on_carrier UP_one_closed) simp next fix p q assume R: "p \ carrier P""q \ carrier P" thenshow"eval R S h s (p \\<^bsub>P\<^esub> q) = eval R S h s p \\<^bsub>S\<^esub> eval R S h s q" proof (simp only: eval_on_carrier UP_mult_closed) from R S have "(\\<^bsub>S\<^esub> i \ {..deg R (p \\<^bsub>P\<^esub> q)}. h (coeff P (p \\<^bsub>P\<^esub> q) i) \\<^bsub>S\<^esub> s [^]\<^bsub>S\<^esub> i) =
(⨁🚫S🚫 i ∈ {..deg R (p ⊗🚫P🚫 q)} ∪ {deg R (p ⊗🚫P🚫 q)<..deg R p + deg R q}.
h (coeff P (p ⊗🚫P🚫 q) i) ⊗🚫S🚫 s [^]🚫S🚫 i)" by (simp cong: S.finsum_cong
add: deg_aboveD S.finsum_Un_disjoint ivl_disj_int_one Pi_def
del: coeff_mult) alsofrom R have"... =
(⨁🚫S🚫 i ∈ {..deg R p + deg R q}. h (coeff P (p ⊗🚫P🚫 q) i) ⊗🚫S🚫 s [^]🚫S🚫 i)" by (simp only: ivl_disj_un_one deg_mult_ring) alsofrom R S have"... =
(⨁🚫S🚫 i ∈ {..deg R p + deg R q}. ⨁🚫S🚫 k ∈ {..i}.
h (coeff P p k) ⊗🚫S🚫 h (coeff P q (i - k)) ⊗🚫S🚫
(s [^]🚫S🚫 k ⊗🚫S🚫 s [^]🚫S🚫 (i - k)))" by (simp cong: S.finsum_cong add: S.nat_pow_mult Pi_def
S.m_ac S.finsum_rdistr) alsofrom R S have"... =
(⨁🚫S🚫 i∈{..deg R p}. h (coeff P p i) ⊗🚫S🚫 s [^]🚫S🚫 i) ⊗🚫S🚫
(⨁🚫S🚫 i∈{..deg R q}. h (coeff P q i) ⊗🚫S🚫 s [^]🚫S🚫 i)" by (simp add: S.cauchy_product [THEN sym] bound.intro deg_aboveD S.m_ac
Pi_def) finallyshow "(\\<^bsub>S\<^esub> i \ {..deg R (p \\<^bsub>P\<^esub> q)}. h (coeff P (p \\<^bsub>P\<^esub> q) i) \\<^bsub>S\<^esub> s [^]\<^bsub>S\<^esub> i) =
(⨁🚫S🚫 i ∈ {..deg R p}. h (coeff P p i) ⊗🚫S🚫 s [^]🚫S🚫 i) ⊗🚫S🚫
(⨁🚫S🚫 i ∈ {..deg R q}. h (coeff P q i) ⊗🚫S🚫 s [^]🚫S🚫 i)" . qed qed
text‹
The following lemma could be proved in‹UP_cring›with the additional
assumption that ‹h›is closed.›
lemma (in UP_pre_univ_prop) eval_const: "[| s \ carrier S; r \ carrier R |] ==> eval R S h s (monom P r 0) = h r" by (simp only: eval_on_carrier monom_closed) simp
text‹Further properties of the evaluation homomorphism.›
text‹The following proofis complicated by the fact that in arbitrary
rings one might have🍋‹one R = zero R›.›
(* TODO: simplify by cases "one R = zero R" *)
lemma (in UP_pre_univ_prop) eval_monom1: assumes S: "s \ carrier S" shows"eval R S h s (monom P \ 1) = s" proof (simp only: eval_on_carrier monom_closed R.one_closed) from S have "(\\<^bsub>S\<^esub> i\{..deg R (monom P \ 1)}. h (coeff P (monom P \ 1) i) \\<^bsub>S\<^esub> s [^]\<^bsub>S\<^esub> i) =
(⨁🚫S🚫 i∈{..deg R (monom P 1 1)} ∪ {deg R (monom P 1 1)<..1}.
h (coeff P (monom P 1 1) i) ⊗🚫S🚫 s [^]🚫S🚫 i)" by (simp cong: S.finsum_cong del: coeff_monom
add: deg_aboveD S.finsum_Un_disjoint ivl_disj_int_one Pi_def) alsohave"... =
(⨁🚫S🚫 i ∈ {..1}. h (coeff P (monom P 1 1) i) ⊗🚫S🚫 s [^]🚫S🚫 i)" by (simp only: ivl_disj_un_one deg_monom_le R.one_closed) alsohave"... = s" proof (cases "s = \\<^bsub>S\<^esub>") case True thenshow ?thesis by (simp add: Pi_def) next case False thenshow ?thesis by (simp add: S Pi_def) qed finallyshow"(\\<^bsub>S\<^esub> i \ {..deg R (monom P \ 1)}.
h (coeff P (monom P 1 1) i) ⊗🚫S🚫 s [^]🚫S🚫 i) = s" . qed
end
text‹Interpretation of ring homomorphism lemmas.›
sublocale UP_univ_prop < ring_hom_cring P S Eval unfolding Eval_def by unfold_locales (fast intro: eval_ring_hom)
lemma (in UP_cring) monom_pow: assumes R: "a \ carrier R" shows"(monom P a n) [^]\<^bsub>P\<^esub> m = monom P (a [^] m) (n * m)" proof (induct m) case 0 from R show ?caseby simp next case Suc with R show ?case by (simp del: monom_mult add: monom_mult [THEN sym] add.commute) qed
lemma (in ring_hom_cring) hom_pow [simp]: "x \ carrier R ==> h (x [^] n) = h x [^]\<^bsub>S\<^esub> (n::nat)" by (induct n) simp_all
lemma (in UP_univ_prop) Eval_monom: "r \ carrier R ==> Eval (monom P r n) = h r \\<^bsub>S\<^esub> s [^]\<^bsub>S\<^esub> n" proof - assume R: "r \ carrier R" from R have"Eval (monom P r n) = Eval (monom P r 0 \\<^bsub>P\<^esub> (monom P \ 1) [^]\<^bsub>P\<^esub> n)" by (simp del: monom_mult add: monom_mult [THEN sym] monom_pow) also from R eval_monom1 [where s = s, folded Eval_def] have"... = h r \\<^bsub>S\<^esub> s [^]\<^bsub>S\<^esub> n" by (simp add: eval_const [where s = s, folded Eval_def]) finallyshow ?thesis . qed
lemma (in UP_pre_univ_prop) eval_monom: assumes R: "r \ carrier R"and S: "s \ carrier S" shows"eval R S h s (monom P r n) = h r \\<^bsub>S\<^esub> s [^]\<^bsub>S\<^esub> n" proof - interpret UP_univ_prop R S h P s "eval R S h s" using UP_pre_univ_prop_axioms P_def R S by (auto intro: UP_univ_prop.intro UP_univ_prop_axioms.intro) from R show ?thesis by (rule Eval_monom) qed
lemma (in UP_univ_prop) Eval_smult: "[| r \ carrier R; p \ carrier P |] ==> Eval (r \\<^bsub>P\<^esub> p) = h r \\<^bsub>S\<^esub> Eval p" proof - assume R: "r \ carrier R"and P: "p \ carrier P" thenshow ?thesis by (simp add: monom_mult_is_smult [THEN sym]
eval_const [where s = s, folded Eval_def]) qed
lemma ring_hom_cringI: assumes"cring R" and"cring S" and"h \ ring_hom R S" shows"ring_hom_cring R S h" by (fast intro: ring_hom_cring.intro ring_hom_cring_axioms.intro
cring.axioms assms)
context UP_pre_univ_prop begin
lemma UP_hom_unique: assumes"ring_hom_cring P S Phi" assumes Phi: "Phi (monom P \ (Suc 0)) = s" "!!r. r \ carrier R ==> Phi (monom P r 0) = h r" assumes"ring_hom_cring P S Psi" assumes Psi: "Psi (monom P \ (Suc 0)) = s" "!!r. r \ carrier R ==> Psi (monom P r 0) = h r" and P: "p \ carrier P"and S: "s \ carrier S" shows"Phi p = Psi p" proof - interpret ring_hom_cring P S Phi by fact interpret ring_hom_cring P S Psi by fact have"Phi p =
Phi (⨁🚫P 🚫i ∈ {..deg R p}. monom P (coeff P p i) 0 ⊗🚫P🚫 monom P 1 1 [^]🚫P🚫 i)" by (simp add: up_repr P monom_mult [THEN sym] monom_pow del: monom_mult) also have"... =
Psi (⨁🚫P 🚫i∈{..deg R p}. monom P (coeff P p i) 0 ⊗🚫P🚫 monom P 1 1 [^]🚫P🚫 i)" by (simp add: Phi Psi P Pi_def comp_def) alsohave"... = Psi p" by (simp add: up_repr P monom_mult [THEN sym] monom_pow del: monom_mult) finallyshow ?thesis . qed
lemma ring_homD: assumes Phi: "Phi \ ring_hom P S" shows"ring_hom_cring P S Phi" by unfold_locales (rule Phi)
theorem UP_universal_property: assumes S: "s \ carrier S" shows"\!Phi. Phi \ ring_hom P S \ extensional (carrier P) \
Phi (monom P 1 1) = s ∧
(∀r ∈ carrier R. Phi (monom P r 0) = h r)" using S eval_monom1 apply (auto intro: eval_ring_hom eval_const eval_extensional) apply (rule extensionalityI) apply (auto intro: UP_hom_unique ring_homD) done
end
text‹JE: The following lemma was added by me; it might be even lifted to a simpler locale›
context monoid begin
lemma nat_pow_eone[simp]: assumes x_in_G: "x \ carrier G"shows"x [^] (1::nat) = x" using nat_pow_Suc [of x 0] unfolding nat_pow_0 [of x] unfolding l_one [OF x_in_G] by simp
end
context UP_ring begin
abbreviation lcoeff :: "(nat =>'a) => 'a"where"lcoeff p == coeff P p (deg R p)"
subsection‹The long division algorithm: some previous facts.›
lemma coeff_minus [simp]: assumes p: "p \ carrier P"and q: "q \ carrier P" shows"coeff P (p \\<^bsub>P\<^esub> q) n = coeff P p n \ coeff P q n" by (simp add: a_minus_def p q)
lemma lcoeff_closed [simp]: assumes p: "p \ carrier P"shows"lcoeff p \ carrier R" using coeff_closed [OF p, of "deg R p"] by simp
lemma deg_smult_decr: assumes a_in_R: "a \ carrier R"and f_in_P: "f \ carrier P"shows"deg R (a \\<^bsub>P\<^esub> f) \ deg R f" using deg_smult_ring [OF a_in_R f_in_P] by (cases "a = \", auto)
lemma coeff_monom_mult: assumes R: "c \ carrier R"and P: "p \ carrier P" shows"coeff P (monom P c n \\<^bsub>P\<^esub> p) (m + n) = c \ (coeff P p m)" proof - have"coeff P (monom P c n \\<^bsub>P\<^esub> p) (m + n) = (\i\{..m + n}. (if n = i then c else \) \ coeff P p (m + n - i))" unfolding coeff_mult [OF monom_closed [OF R, of n] P, of "m + n"] unfolding coeff_monom [OF R, of n] by simp alsohave"(\i\{..m + n}. (if n = i then c else \) \ coeff P p (m + n - i)) =
(⨁i∈{..m + n}. (if n = i then c ⊗ coeff P p (m + n - i) else 0))" using R.finsum_cong [of "{..m + n}""{..m + n}""(\i::nat. (if n = i then c else \) \ coeff P p (m + n - i))" "(\i::nat. (if n = i then c \ coeff P p (m + n - i) else \))"] using coeff_closed [OF P] unfolding Pi_def simp_implies_def using R by auto alsohave"\ = c \ coeff P p m"using R.finsum_singleton [of n "{..m + n}""(\i. c \ coeff P p (m + n - i))"] unfolding Pi_def using coeff_closed [OF P] using P R by auto finallyshow ?thesis by simp qed
lemma deg_lcoeff_cancel: assumes p_in_P: "p \ carrier P"and q_in_P: "q \ carrier P"and r_in_P: "r \ carrier P" and deg_r_nonzero: "deg R r \ 0" and deg_R_p: "deg R p \ deg R r"and deg_R_q: "deg R q \ deg R r" and coeff_R_p_eq_q: "coeff P p (deg R r) = \\<^bsub>R\<^esub> (coeff P q (deg R r))" shows"deg R (p \\<^bsub>P\<^esub> q) < deg R r" proof - have deg_le: "deg R (p \\<^bsub>P\<^esub> q) \ deg R r" proof (rule deg_aboveI) fix m assume deg_r_le: "deg R r < m" show"coeff P (p \\<^bsub>P\<^esub> q) m = \" proof - have slp: "deg R p < m"and"deg R q < m"using deg_R_p deg_R_q using deg_r_le by auto thenhave max_sl: "max (deg R p) (deg R q) < m"by simp thenhave"deg R (p \\<^bsub>P\<^esub> q) < m"using deg_add [OF p_in_P q_in_P] by arith with deg_R_p deg_R_q show ?thesis using coeff_add [OF p_in_P q_in_P, of m] using deg_aboveD [of "p \\<^bsub>P\<^esub> q" m] using p_in_P q_in_P by simp qed qed (simp add: p_in_P q_in_P) moreoverhave deg_ne: "deg R (p \\<^bsub>P\<^esub> q) \ deg R r" proof (rule ccontr) assume nz: "\ deg R (p \\<^bsub>P\<^esub> q) \ deg R r"thenhave deg_eq: "deg R (p \\<^bsub>P\<^esub> q) = deg R r"by simp from deg_r_nonzero have r_nonzero: "r \ \\<^bsub>P\<^esub>"by (cases "r = \\<^bsub>P\<^esub>", simp_all) have"coeff P (p \\<^bsub>P\<^esub> q) (deg R r) = \\<^bsub>R\<^esub>"using coeff_add [OF p_in_P q_in_P, of "deg R r"] using coeff_R_p_eq_q using coeff_closed [OF p_in_P, of "deg R r"] coeff_closed [OF q_in_P, of "deg R r"] by algebra with lcoeff_nonzero [OF r_nonzero r_in_P] and deg_eq show False using lcoeff_nonzero [of "p \\<^bsub>P\<^esub> q"] using p_in_P q_in_P using deg_r_nonzero by (cases "p \\<^bsub>P\<^esub> q \ \\<^bsub>P\<^esub>", auto) qed ultimatelyshow ?thesis by simp qed
lemma monom_deg_mult: assumes f_in_P: "f \ carrier P"and g_in_P: "g \ carrier P"and deg_le: "deg R g \ deg R f" and a_in_R: "a \ carrier R" shows"deg R (g \\<^bsub>P\<^esub> monom P a (deg R f - deg R g)) \ deg R f" using deg_mult_ring [OF g_in_P monom_closed [OF a_in_R, of "deg R f - deg R g"]] apply (cases "a = \") using g_in_P apply simp using deg_monom [OF _ a_in_R, of "deg R f - deg R g"] using deg_le by simp
lemma deg_zero_impl_monom: assumes f_in_P: "f \ carrier P"and deg_f: "deg R f = 0" shows"f = monom P (coeff P f 0) 0" apply (rule up_eqI) using coeff_monom [OF coeff_closed [OF f_in_P], of 0 0] using f_in_P deg_f using deg_aboveD [of f _] by auto
end
subsection ‹The long division prooffor commutative rings›
context UP_cring begin
lemma exI3: assumes exist: "Pred x y z" shows"\ x y z. Pred x y z" using exist by blast
text‹Jacobson's Theorem 2.14\
lemma long_div_theorem: assumes g_in_P [simp]: "g \ carrier P"and f_in_P [simp]: "f \ carrier P" and g_not_zero: "g \ \\<^bsub>P\<^esub>" shows"\q r (k::nat). (q \ carrier P) \ (r \ carrier P) \ (lcoeff g)[^]\<^bsub>R\<^esub>k \\<^bsub>P\<^esub> f = g \\<^bsub>P\<^esub> q \\<^bsub>P\<^esub> r \ (r = \\<^bsub>P\<^esub> \ deg R r < deg R g)" using f_in_P proof (induct "deg R f" arbitrary: "f" rule: nat_less_induct) case (1 f) note f_in_P [simp] = "1.prems" let ?pred = "(\ q r (k::nat).
(q ∈ carrier P) ∧ (r ∈ carrier P) ∧ (lcoeff g)[^]🚫R🚫k ⊙🚫P🚫 f = g ⊗🚫P🚫 q ⊕🚫P🚫 r ∧ (r = 0🚫P🚫∨ deg R r < deg R g))" let ?lg = "lcoeff g"and ?lf = "lcoeff f" show ?case proof (cases "deg R f < deg R g") case True have"?pred \\<^bsub>P\<^esub> f 0"using True by force thenshow ?thesis by blast next case False thenhave deg_g_le_deg_f: "deg R g \ deg R f"by simp
{ let ?k = "1::nat" let ?f1 = "(g \\<^bsub>P\<^esub> (monom P (?lf) (deg R f - deg R g))) \\<^bsub>P\<^esub> \\<^bsub>P\<^esub> (?lg \\<^bsub>P\<^esub> f)" let ?q = "monom P (?lf) (deg R f - deg R g)" have f1_in_carrier: "?f1 \ carrier P"and q_in_carrier: "?q \ carrier P"by simp_all show ?thesis proof (cases "deg R f = 0") case True
{
--> --------------------
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.