text‹
Polynomials are formalised as modules with additional operations for
extracting coefficients from polynomials and for 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 cite‹"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 0 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. ⨁i ∈ {..n}. p i ⊗ q (n-i)), one = (λi. if i=0 then 1 else 0), zero = (λi. 0), add = (λp∈up R. λq∈up R. λi. p i ⊕ q i), smult = (λa∈carrier R. λp∈up R. λi. a ⊗ p i), monom = (λa∈carrier R. λn i. if i=n then a else 0), coeff = (λp∈up R. λn. p n))"
text‹
Properties of the set of polynomials term‹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 0 n f"by (simp add: up_def)
lemma up_one_closed: "(λn. if n = 0 then 1 else 0) ∈ 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 0 n (λi. p i ⊕ q i)" proof - from UP obtain n where boundn: "bound 0 n p"by fast from UP obtain m where boundm: "bound 0 m q"by fast have"bound 0 (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 = 0"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 0 n p"by auto thenhave"bound 0 n (λi. ⊖ p i)" by (simp add: bound_def minus_equality) thenshow"∃n. bound 0 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 0 n (λn. ⨁i ∈ {..n}. p i ⊗ q (n-i))" proof - from UP obtain n where boundn: "bound 0 n p"by fast from UP obtain m where boundm: "bound 0 m q"by fast have"bound 0 (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) = 0" proof (cases "n < i") case True with boundn have"p i = 0"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) = 0"by auto moreoverfrom UP have"p i ∈ carrier R"by auto ultimatelyshow ?thesis by simp qed
} thenshow"(⨁i ∈ {..k}. p i ⊗ q (k-i)) = 0" 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 0)" proof - assume R: "a ∈ carrier R" thenhave"(λn. if n = m then a else 0) ∈ up R" using up_def by force with R show ?thesis by (simp add: UP_def) qed
lemma coeff_zero [simp]: "coeff P 0 n = 0"by (auto simp add: UP_def)
lemma coeff_one [simp]: "coeff P 1 n = (if n=0 then 1 else 0)" using up_one_closed by (simp add: UP_def)
lemma coeff_smult [simp]: "[| a ∈ carrier R; p ∈ carrier P |] ==> coeff P (a ⊙ 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 ⊕ 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 ⊗ 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 term‹P›.›
lemma UP_mult_closed [simp]: "[| p ∈ carrier P; q ∈ carrier P |] ==> p ⊗ 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 ⊕ p = 0" 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 ⊕ p = 0" 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 ⊗ q) ⊗ r = p ⊗ (q ⊗ 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) case0thenshow ?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 ⊗ q) ⊗ r) n = coeff P (p ⊗ (q ⊗ r)) n" by (simp add: Pi_def) qed (simp_all add: R)
lemma UP_r_one [simp]: assumes R: "p ∈ carrier P"shows"p ⊗1 = p" proof (rule up_eqI) fix n show"coeff P (p ⊗1) n = coeff P p n" proof (cases n) case0
{ 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 ⊗1) (Suc nn) = coeff P p (Suc nn)" proof - have"coeff P (p ⊗1) (Suc nn) = (⨁i∈{..Suc nn}. coeff P p i ⊗ (if Suc nn ≤ i then 1 else 0))"using R by simp alsohave"… = coeff P p (Suc nn) ⊗ (if Suc nn ≤ Suc nn then 1 else 0) ⊕ (⨁i∈{..nn}. coeff P p i ⊗ (if Suc nn ≤ i then 1 else 0))" using finsum_Suc [of "(λi::nat. coeff P p i ⊗ (if Suc nn ≤ i then 1 else 0))""nn"] unfolding Pi_def using R by simp alsohave"… = coeff P p (Suc nn) ⊗ (if Suc nn ≤ Suc nn then 1 else 0)" proof - have"(⨁i∈{..nn}. coeff P p i ⊗ (if Suc nn ≤ i then 1 else 0)) = (⨁i∈{..nn}. 0)" using finsum_cong [of "{..nn}""{..nn}""(λi::nat. coeff P p i ⊗ (if Suc nn ≤ i then 1 else 0))""(λi::nat. 0)"] using R unfolding Pi_def by simp alsohave"… = 0"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"1⊗ p = p" proof (rule up_eqI) fix n show"coeff P (1⊗ p) n = coeff P p n" proof (cases n) case0with 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 ⊗ q = q ⊗ 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) case0thenshow ?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 ⊗ q) n = coeff P (q ⊗ 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 ==> ⊖ 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 (⊖ p) n = ⊖ (coeff P p n)" proof - from R coeff_closed UP_a_inv_closed have "coeff P (⊖ p) n = ⊖ coeff P p n ⊕ (coeff P p n ⊕ coeff P (⊖ 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 = a ⊙ p ⊕ b ⊙ 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 ⊕ q) = a ⊙ p ⊕ a ⊙ 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 = a ⊙ (b ⊙ p)" by (rule up_eqI) (simp_all add: R.m_assoc)
lemma UP_smult_zero [simp]: "p ∈ carrier P ==> 0⊙ p = 0" by (rule up_eqI) simp_all
lemma UP_smult_one [simp]: "p ∈ carrier P ==> 1⊙ p = p" by (rule up_eqI) simp_all
lemma UP_smult_assoc2: "[| a ∈ carrier R; p ∈ carrier P; q ∈ carrier P |] ==> (a ⊙ p) ⊗ q = a ⊙ (p ⊗ q)" by (rule up_eqI) (simp_all add: R.finsum_rdistr R.m_assoc Pi_def)
end
text‹
Interpretation of lemmas from term‹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 0 n = 0"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 ⊗ p = a ⊙ p" proof (rule up_eqI) fix n show"coeff P (monom P a 0 ⊗ p) n = coeff P (a ⊙ p) n" proof (cases n) case0with 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 1 0 = 1" 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 ⊕ monom P b n" by (rule up_eqI) simp_all
lemma monom_one_Suc: "monom P 1 (Suc n) = monom P 1 n ⊗ monom P 1 1" proof (rule up_eqI) fix k show"coeff P (monom P 1 (Suc n)) k = coeff P (monom P 1 n ⊗ monom P 1 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 1 (Suc n)) k = 1"by simp alsofrom True have"... = (⨁i ∈ {..<n} ∪ {n}. coeff P (monom P 1 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 1 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 1 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 1 n ⊗ monom P 1 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 1 else 0) ⊗ (if Suc 0 = k - i then 1 else 0)" from neq have"coeff P (monom P 1 (Suc n)) k = 0"by simp alsohave"... = (⨁i ∈ {..k}. ?s i)" proof - have f1: "(⨁i ∈ {..<n}. ?s i) = 0" by (simp cong: R.finsum_cong add: Pi_def) from neq have f2: "(⨁i ∈ {n}. ?s i) = 0" by (simp cong: R.finsum_cong add: Pi_def) arith have f3: "n < k ==> (⨁i ∈ {n<..k}. ?s i) = 0" 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"0 = (⨁i ∈ {..<n} ∪ {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"0 = (⨁i ∈ {..<n} ∪ {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 1 n ⊗ monom P 1 1) k"by simp finallyshow ?thesis . qed qed (simp_all)
lemma monom_one_Suc2: "monom P 1 (Suc n) = monom P 1 1 ⊗ monom P 1 n" proof (induct n) case0show ?caseby simp next case Suc
{ fix k:: nat assume hypo: "monom P 1 (Suc k) = monom P 1 1 ⊗ monom P 1 k" thenshow"monom P 1 (Suc (Suc k)) = monom P 1 1 ⊗ monom P 1 (Suc k)" proof - have lhs: "monom P 1 (Suc (Suc k)) = monom P 1 1 ⊗ monom P 1 k ⊗ monom P 1 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 1 ⊗ monom P 1 (Suc k) = monom P 1 1 ⊗ monom P 1 k ⊗ monom P 1 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 from lemmas @{thm "monom_one_Suc"}
and @{thm "monom_one_Suc2"}, and is trivial in term‹UP_cring››
corollary monom_one_comm: shows"monom P 1 k ⊗ monom P 1 1 = monom P 1 1 ⊗ monom P 1 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 ⊙ monom P b n" by (rule up_eqI) simp_all
lemma monom_one_mult: "monom P 1 (n + m) = monom P 1 n ⊗ monom P 1 m" proof (induct n) case0show ?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 1 n ⊗ monom P 1 m = monom P 1 m ⊗ monom P 1 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 ⊗ 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 ⊗ 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 0) ⊗ (if m = n + m - i then b else 0))" "(λi. if n = i then a ⊗ b else 0)"]
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 0) ⊗ (if m = k - i then b else 0))""(λi. 0)"] 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 = ⊖ 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 0 n (coeff (UP R) p))"
context UP_ring begin
lemma deg_aboveI: "[| (!!m. n < m ==> coeff P p m = 0); p ∈ carrier P |] ==> deg R p <= n" by (unfold deg_def P_def) (fast intro: Least_le)
(* lemmacoeff_bound_ex:"EXn.boundn(coeffp)" proof- have"(\<lambda>n.coeffpn):UP"by(simpadd:coeff_defRep_UP) thenobtainnwhere"boundn(coeffp)"by(unfoldUP_def)fast thenshow?thesis.. qed
lemmabound_coeff_obtain: assumesprem:"(!!n.boundn(coeffp)==>P)"shows"P" proof- have"(\<lambda>n.coeffpn):UP"by(simpadd:coeff_defRep_UP) thenobtainnwhere"boundn(coeffp)"by(unfoldUP_def)fast withpremshowP. qed
*)
lemma deg_aboveD: assumes"deg R p < m"and"p ∈ carrier P" shows"coeff P p m = 0" proof - from‹p ∈ carrier P›obtain n where"bound 0 n (coeff P p)" by (auto simp add: UP_def P_def) thenhave"bound 0 (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 ≠0" 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 ≠0"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) ≠0" proof - from R obtain m where"deg R p ≤ m"and m_coeff: "coeff P p m ≠0" 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 0 n (coeff P p))" by (unfold deg_def P_def) simp thenhave"¬ bound 0 (deg R p - 1) (coeff P p)"by (rule not_less_Least) thenhave"∃m. deg R p - 1 < m ∧ coeff P p m ≠0" by (unfold bound_def) fast thenhave"∃m. deg R p ≤ m ∧ coeff P p m ≠0"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 ≠0"and R: "p ∈ carrier P" shows"coeff P p 0 ≠0" proof - have"∃m. coeff P p m ≠0" proof (rule classical) assume"¬ ?thesis" with R have"p = 0"by (auto intro: up_eqI) with nonzero show ?thesis by contradiction qed thenobtain m where coeff: "coeff P p m ≠0" .. 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 ≠0"and R: "p ∈ carrier P" shows"coeff P p (deg R p) ≠0" 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 = 0; ∧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 ⊕ 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 ≠0; 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 0 = 0" proof (rule le_antisym) show"deg R 0≤ 0"by (rule deg_aboveI) simp_all next show"0 ≤ deg R 0"by (rule deg_belowI) simp_all qed
lemma deg_one [simp]: "deg R 1 = 0" proof (rule le_antisym) show"deg R 1≤ 0"by (rule deg_aboveI) simp_all next show"0 ≤ deg R 1"by (rule deg_belowI) simp_all qed
lemma deg_uminus [simp]: assumes R: "p ∈ carrier P"shows"deg R (⊖ p) = deg R p" proof (rule le_antisym) show"deg R (⊖ p) ≤ deg R p"by (simp add: deg_aboveI deg_aboveD R) next show"deg R p ≤ deg R (⊖ p)" by (simp add: deg_belowI lcoeff_nonzero_deg
inj_on_eq_iff [OF R.a_inv_inj, of _ "0", simplified] R) qed
text‹The following lemma is 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) ≤ (if a = 0 then 0 else deg R p)" by (cases "a = 0") (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 ⊙ p) = (if a = 0 then 0 else deg R p)" proof (rule le_antisym) show"deg R (a ⊙ p) ≤ (if a = 0 then 0 else deg R p)" using R by (rule deg_smult_ring) next show"(if a = 0 then 0 else deg R p) ≤ deg R (a ⊙ p)" proof (cases "a = 0") 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 ⊗ 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) = 0" 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 ⊗ q) m = 0"by simp qed (simp add: R)
end
context UP_domain begin
lemma deg_mult [simp]: "[| p ≠0; q ≠0; p ∈ carrier P; q ∈ carrier P |] ==> deg R (p ⊗ q) = deg R p + deg R q" proof (rule le_antisym) assume"p ∈ carrier P"" q ∈ carrier P" thenshow"deg R (p ⊗ 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 ≠0""q ≠0" 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 ⊗ 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) ≠0" by (simp add: integral_iff lcoeff_nonzero R) qed (simp add: R) qed
end
text‹The following lemmas also can be lifted to term‹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"(⨁ 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 0) ∈ carrier R" by simp show"coeff P (⨁ i ∈ {..deg R p}. ?s i) k = coeff P p k" proof (cases "k ≤ deg R p") case True hence"coeff P (⨁ i ∈ {..deg R p}. ?s i) k = coeff P (⨁ i ∈ {..k} ∪ {k<..deg R p}. ?s i) k" by (simp only: ivl_disj_un_one) alsofrom True have"... = coeff P (⨁ 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 (⨁ i ∈ {..<k} ∪ {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 (⨁ i ∈ {..deg R p}. ?s i) k = coeff 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 |] ==> (⨁ 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: "1≠0" proof assume"1 = 0" hence"coeff P 1 0 = (coeff P 0 0)"by simp hence"1 = 0"by simp with R.one_not_zero show"False"by contradiction qed
lemma UP_integral: "[| p ⊗ q = 0; p ∈ carrier P; q ∈ carrier P |] ==> p = 0∨ q = 0" proof - fix p q assume pq: "p ⊗ q = 0"and R: "p ∈ carrier P""q ∈ carrier P" show"p = 0∨ q = 0" proof (rule classical) assume c: "¬ (p = 0∨ q = 0)" with R have"deg R p + deg R q = deg R (p ⊗ 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 = (⨁ 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 = (⨁ 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 ⊗ q) 0"by simp alsofrom pq have"... = 0"by simp finallyhave"coeff P p 0 ⊗ coeff P q 0 = 0" . with R have"coeff P p 0 = 0∨ coeff P q 0 = 0" by (simp add: R.integral_iff) with p q show"p = 0∨ q = 0"by fastforce qed qed
text‹
Interpretation of theorems from term‹domain›. ›
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(inabelian_monoid)finsum_cong2: "[|!!i.i\<in>A==>fi\<in>carrierG=True;A=B; !!i.i\<in>B==>fi=gi|]==>finsumGfA=finsumGgB"
sorry*)
lemma (in abelian_monoid) boundD_carrier: "[| bound 0 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) case0from 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 0 n f"and bg: "bound 0 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). ⨁i ∈ {..deg R p}. phi (coeff (UP R) p i) ⊗ s [^] i)"
context UP begin
lemma eval_on_carrier: fixes S (structure) shows"p ∈ carrier P ==> eval R S phi s p = (⨁ i ∈ {..deg R p}. phi (coeff P p i) ⊗ 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 lemma from Ring.thy and lifted then to the locale term‹ring_hom_ring› from term‹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 ⊕ q) = eval R S h s p ⊕ eval R S h s q" proof (simp only: eval_on_carrier P.a_closed) from S R have "(⨁i∈{..deg R (p ⊕ q)}. h (coeff P (p ⊕ q) i) ⊗ s [^] i) = (⨁i∈{..deg R (p ⊕ q)} ∪ {deg R (p ⊕ q)<..max (deg R p) (deg R q)}. h (coeff P (p ⊕ q) i) ⊗ 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"... = (⨁ i ∈ {..max (deg R p) (deg R q)}. h (coeff P (p ⊕ q) i) ⊗ s [^] i)" by (simp add: ivl_disj_un_one) alsofrom R S have"... = (⨁i∈{..max (deg R p) (deg R q)}. h (coeff P p i) ⊗ s [^] i) ⊕ (⨁i∈{..max (deg R p) (deg R q)}. h (coeff P q i) ⊗ s [^] i)" by (simp cong: S.finsum_cong
add: S.l_distr deg_aboveD ivl_disj_int_one Pi_def) alsohave"... = (⨁ i ∈ {..deg R p} ∪ {deg R p<..max (deg R p) (deg R q)}. h (coeff P p i) ⊗ s [^] i) ⊕ (⨁ i ∈ {..deg R q} ∪ {deg R q<..max (deg R p) (deg R q)}. h (coeff P q i) ⊗ s [^] i)" by (simp only: ivl_disj_un_one max.cobounded1 max.cobounded2) alsofrom R S have"... = (⨁ i ∈ {..deg R p}. h (coeff P p i) ⊗ s [^] i) ⊕ (⨁ i ∈ {..deg R q}. h (coeff P q i) ⊗ s [^] i)" by (simp cong: S.finsum_cong
add: deg_aboveD S.finsum_Un_disjoint ivl_disj_int_one Pi_def) finallyshow "(⨁i ∈ {..deg R (p ⊕ q)}. h (coeff P (p ⊕ q) i) ⊗ s [^] i) = (⨁i ∈ {..deg R p}. h (coeff P p i) ⊗ s [^] i) ⊕ (⨁i ∈ {..deg R q}. h (coeff P q i) ⊗ s [^] i)" . qed next show"eval R S h s 1 = 1" 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 ⊗ q) = eval R S h s p ⊗ eval R S h s q" proof (simp only: eval_on_carrier UP_mult_closed) from R S have "(⨁ i ∈ {..deg R (p ⊗ q)}. h (coeff P (p ⊗ q) i) ⊗ s [^] i) = (⨁ i ∈ {..deg R (p ⊗ q)} ∪ {deg R (p ⊗ q)<..deg R p + deg R q}. h (coeff P (p ⊗ q) i) ⊗ 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"... = (⨁ i ∈ {..deg R p + deg R q}. h (coeff P (p ⊗ q) i) ⊗ s [^] i)" by (simp only: ivl_disj_un_one deg_mult_ring) alsofrom R S have"... = (⨁ i ∈ {..deg R p + deg R q}. ⨁ k ∈ {..i}. h (coeff P p k) ⊗ h (coeff P q (i - k)) ⊗ (s [^] k ⊗ 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"... = (⨁ i∈{..deg R p}. h (coeff P p i) ⊗ s [^] i) ⊗ (⨁ i∈{..deg R q}. h (coeff P q i) ⊗ s [^] i)" by (simp add: S.cauchy_product [THEN sym] bound.intro deg_aboveD S.m_ac
Pi_def) finallyshow "(⨁ i ∈ {..deg R (p ⊗ q)}. h (coeff P (p ⊗ q) i) ⊗ s [^] i) = (⨁ i ∈ {..deg R p}. h (coeff P p i) ⊗ s [^] i) ⊗ (⨁ i ∈ {..deg R q}. h (coeff P q i) ⊗ 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 proof is complicated by the fact that in arbitrary
rings one might have term‹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 1) = s" proof (simp only: eval_on_carrier monom_closed R.one_closed) from S have "(⨁ i∈{..deg R (monom P 1 1)}. h (coeff P (monom P 1 1) i) ⊗ s [^] i) = (⨁ i∈{..deg R (monom P 1 1)} ∪ {deg R (monom P 1 1)<..1}. h (coeff P (monom P 1 1) i) ⊗ 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"... = (⨁ i ∈ {..1}. h (coeff P (monom P 1 1) i) ⊗ s [^] i)" by (simp only: ivl_disj_un_one deg_monom_le R.one_closed) alsohave"... = s" proof (cases "s = 0") case True thenshow ?thesis by (simp add: Pi_def) next case False thenshow ?thesis by (simp add: S Pi_def) qed finallyshow"(⨁ i ∈ {..deg R (monom P 1 1)}. h (coeff P (monom P 1 1) i) ⊗ 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) [^] m = monom P (a [^] m) (n * m)" proof (induct m) case0from 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 [^] (n::nat)" by (induct n) simp_all
lemma (in UP_univ_prop) Eval_monom: "r ∈ carrier R ==> Eval (monom P r n) = h r ⊗ s [^] n" proof - assume R: "r ∈ carrier R" from R have"Eval (monom P r n) = Eval (monom P r 0 ⊗ (monom P 1 1) [^] 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 ⊗ s [^] 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 ⊗ s [^] 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 ⊙ p) = h r ⊗ 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 1 (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 1 (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 (⨁i ∈ {..deg R p}. monom P (coeff P p i) 0 ⊗ monom P 1 1 [^] i)" by (simp add: up_repr P monom_mult [THEN sym] monom_pow del: monom_mult) also have"... = Psi (⨁i∈{..deg R p}. monom P (coeff P p i) 0 ⊗ monom P 1 1 [^] 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)"
lemma lcoeff_nonzero2: assumes p_in_R: "p ∈ carrier P"and p_not_zero: "p ≠0"shows"lcoeff p ≠0" using lcoeff_nonzero [OF p_not_zero p_in_R] .
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 ⊖ 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 ⊙ f) ≤ deg R f" using deg_smult_ring [OF a_in_R f_in_P] by (cases "a = 0", auto)
lemma coeff_monom_mult: assumes R: "c ∈ carrier R"and P: "p ∈ carrier P" shows"coeff P (monom P c n ⊗ p) (m + n) = c ⊗ (coeff P p m)" proof - have"coeff P (monom P c n ⊗ p) (m + n) = (⨁i∈{..m + n}. (if n = i then c else 0)⊗ 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 0) ⊗ 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 0) ⊗coeff P p (m + n - i))" "(λi::nat. (if n = i then c ⊗ coeff P p (m + n - i) else 0))"] 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) = ⊖ (coeff P q (deg R r))" shows"deg R (p ⊕ q) < deg R r" proof - have deg_le: "deg R (p ⊕ q) ≤ deg R r" proof (rule deg_aboveI) fix m assume deg_r_le: "deg R r < m" show"coeff P (p ⊕ q) m = 0" 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 ⊕ 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 ⊕ 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 ⊕ q) ≠ deg R r" proof (rule ccontr) assume nz: "¬ deg R (p ⊕ q) ≠ deg R r"thenhave deg_eq: "deg R (p ⊕ q) = deg R r"by simp from deg_r_nonzero have r_nonzero: "r ≠0"by (cases "r = 0", simp_all) have"coeff P (p ⊕ q) (deg R r) = 0"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 ⊕ q"] using p_in_P q_in_P using deg_r_nonzero by (cases "p ⊕ q ≠0", 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 ⊗ 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 = 0") 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 00] using f_in_P deg_f using deg_aboveD [of f _] by auto
end
subsection‹The long division proof for 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 ≠0" shows"∃q r (k::nat). (q ∈ carrier P) ∧ (r ∈ carrier P) ∧ (lcoeff g)[^]k ⊙ f = g ⊗ q ⊕ r ∧ (r = 0∨ 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)[^]k ⊙ f = g ⊗ q ⊕ r ∧ (r = 0∨ 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 0 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 ⊗ (monom P (?lf) (deg R f - deg R g))) ⊕⊖ (?lg ⊙ 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
{ have deg_g: "deg R g = 0"using True using deg_g_le_deg_f by simp have"?pred f 0 1" using deg_zero_impl_monom [OF g_in_P deg_g] using sym [OF monom_mult_is_smult [OF coeff_closed [OF g_in_P, of 0] f_in_P]] using deg_g by simp thenshow ?thesis by blast
} next case False note deg_f_nzero = False
{ have exist: "lcoeff g [^] ?k ⊙ f = g ⊗ ?q ⊕⊖ ?f1" by (simp add: minus_add r_neg sym [
OF a_assoc [of "g ⊗ ?q""⊖ (g ⊗ ?q)""lcoeff g ⊙ f"]]) have deg_remainder_l_f: "deg R (⊖ ?f1) < deg R f" proof (unfold deg_uminus [OF f1_in_carrier]) show"deg R ?f1 < deg R f" proof (rule deg_lcoeff_cancel) show"deg R (⊖ (?lg ⊙ f)) ≤ deg R f" using deg_smult_ring [of ?lg f] using lcoeff_nonzero2 [OF g_in_P g_not_zero] by simp show"deg R (g ⊗ ?q) ≤ deg R f" by (simp add: monom_deg_mult [OF f_in_P g_in_P deg_g_le_deg_f, of ?lf]) show"coeff P (g ⊗ ?q) (deg R f) = ⊖ coeff P (⊖ (?lg ⊙ f)) (deg R f)" unfolding coeff_mult [OF g_in_P monom_closed
[OF lcoeff_closed [OF f_in_P],
of "deg R f - deg R g"], of "deg R f"] unfolding coeff_monom [OF lcoeff_closed
[OF f_in_P], of "(deg R f - deg R g)"] using R.finsum_cong' [of "{..deg R f}""{..deg R f}" "(λi. coeff P g i ⊗ (if deg R f - deg R g = deg R f - i then ?lf else 0))" "(λi. if deg R g = i then coeff P g i ⊗ ?lf else 0)"] using R.finsum_singleton [of "deg R g""{.. deg R f}""(λi. coeff P g i ⊗ ?lf)"] unfolding Pi_def using deg_g_le_deg_f by force qed (simp_all add: deg_f_nzero) qed thenobtain q' r' k' where rem_desc: "?lg [^] (k'::nat) ⊙ (⊖ ?f1) = g ⊗ q' ⊕ r'" and rem_deg: "(r' = 0∨ deg R r' < deg R g)" and q'_in_carrier: "q' ∈ carrier P"and r'_in_carrier: "r' ∈ carrier P" using"1.hyps"using f1_in_carrier by blast show ?thesis proof (rule exI3 [of _ "((?lg [^] k') ⊙ ?q ⊕ q')" r' "Suc k'"], intro conjI) show"(?lg [^] (Suc k')) ⊙ f = g ⊗ ((?lg [^] k') ⊙ ?q ⊕ q') ⊕ r'" proof - have"(?lg [^] (Suc k')) ⊙ f = (?lg [^] k') ⊙ (g ⊗ ?q ⊕⊖ ?f1)" using smult_assoc1 [OF _ _ f_in_P] using exist by simp alsohave"… = (?lg [^] k') ⊙ (g ⊗ ?q) ⊕ ((?lg [^] k') ⊙ ( ⊖ ?f1))" using UP_smult_r_distr by simp alsohave"… = (?lg [^] k') ⊙ (g ⊗ ?q) ⊕ (g ⊗ q' ⊕ r')" unfolding rem_desc .. alsohave"… = (?lg [^] k') ⊙ (g ⊗ ?q) ⊕ g ⊗ q' ⊕ r'" using sym [OF a_assoc [of "?lg [^] k' ⊙ (g ⊗ ?q)""g ⊗ q'""r'"]] using r'_in_carrier q'_in_carrier by simp alsohave"… = (?lg [^] k') ⊙ (?q ⊗ g) ⊕ q' ⊗ g ⊕ r'" using q'_in_carrier by (auto simp add: m_comm) alsohave"… = (((?lg [^] k') ⊙ ?q) ⊗ g) ⊕ q' ⊗ g ⊕ r'" using smult_assoc2 q'_in_carrier "1.prems"by auto alsohave"… = ((?lg [^] k') ⊙ ?q ⊕ q') ⊗ g ⊕ r'" using sym [OF l_distr] and q'_in_carrier by auto finallyshow ?thesis using m_comm q'_in_carrier by auto qed qed (simp_all add: rem_deg q'_in_carrier r'_in_carrier)
} qed
} qed qed
end
text‹The remainder theorem as corollary of the long division theorem.›
context UP_cring begin
lemma deg_minus_monom: assumes a: "a ∈ carrier R" and R_not_trivial: "(carrier R ≠ {0})" shows"deg R (monom P 1 1 ⊖ monom P a 0) = 1"
(is"deg R ?g = 1") proof - have"deg R ?g ≤ 1" proof (rule deg_aboveI) fix m assume"(1::nat) < m" thenshow"coeff P ?g m = 0" using coeff_minus using a by auto algebra qed (simp add: a) moreoverhave"deg R ?g ≥ 1" proof (rule deg_belowI) show"coeff P ?g 1 ≠0" using a using R.carrier_one_not_zero R_not_trivial by simp algebra qed (simp add: a) ultimatelyshow ?thesis by simp qed
lemma lcoeff_monom: assumes a: "a ∈ carrier R"and R_not_trivial: "(carrier R ≠ {0})" shows"lcoeff (monom P 1 1 ⊖ monom P a 0) = 1" using deg_minus_monom [OF a R_not_trivial] using coeff_minus a by auto algebra
lemma deg_nzero_nzero: assumes deg_p_nzero: "deg R p ≠ 0" shows"p ≠0" using deg_zero deg_p_nzero by auto
lemma deg_monom_minus: assumes a: "a ∈ carrier R" and R_not_trivial: "carrier R ≠ {0}" shows"deg R (monom P 1 1 ⊖ monom P a 0) = 1"
(is"deg R ?g = 1") proof - have"deg R ?g ≤ 1" proof (rule deg_aboveI) fix m::nat assume"1 < m"thenshow"coeff P ?g m = 0" using coeff_minus [OF monom_closed [OF R.one_closed, of 1] monom_closed [OF a, of 0], of m] using coeff_monom [OF R.one_closed, of 1 m] using coeff_monom [OF a, of 0 m] by auto algebra qed (simp add: a) moreoverhave"1 ≤ deg R ?g" proof (rule deg_belowI) show"coeff P ?g 1 ≠0" using coeff_minus [OF monom_closed [OF R.one_closed, of 1] monom_closed [OF a, of 0], of 1] using coeff_monom [OF R.one_closed, of 11] using coeff_monom [OF a, of 01] using R_not_trivial using R.carrier_one_not_zero by auto algebra qed (simp add: a) ultimatelyshow ?thesis by simp qed
lemma eval_monom_expr: assumes a: "a ∈ carrier R" shows"eval R R id a (monom P 1 1 ⊖ monom P a 0) = 0"
(is"eval R R id a ?g = _") proof - interpret UP_pre_univ_prop R R id by unfold_locales simp have eval_ring_hom: "eval R R id a ∈ ring_hom P R"using eval_ring_hom [OF a] by simp interpret ring_hom_cring P R "eval R R id a"by unfold_locales (rule eval_ring_hom) have mon1_closed: "monom P 1 1 ∈ carrier P" and mon0_closed: "monom P a 0 ∈ carrier P" and min_mon0_closed: "⊖ monom P a 0 ∈ carrier P" using a R.a_inv_closed by auto have"eval R R id a ?g = eval R R id a (monom P 1 1) ⊖ eval R R id a (monom P a 0)" by (simp add: a_minus_def mon0_closed) alsohave"… = a ⊖ a" using eval_monom [OF R.one_closed a, of 1] using eval_monom [OF a a, of 0] using a by simp alsohave"… = 0" using a by algebra finallyshow ?thesis by simp qed
lemma remainder_theorem_exist: assumes f: "f ∈ carrier P"and a: "a ∈ carrier R" and R_not_trivial: "carrier R ≠ {0}" shows"∃ q r. (q ∈ carrier P) ∧ (r ∈ carrier P) ∧ f = (monom P 1 1 ⊖ monom P a 0)⊗ q ⊕ r ∧ (deg R r = 0)"
(is"∃ q r. (q ∈ carrier P) ∧ (r ∈ carrier P) ∧ f = ?g ⊗ q ⊕ r ∧ (deg R r = 0)") proof - let ?g = "monom P 1 1 ⊖ monom P a 0" from deg_minus_monom [OF a R_not_trivial] have deg_g_nzero: "deg R ?g ≠ 0"by simp have"∃q r (k::nat). q ∈ carrier P ∧ r ∈ carrier P ∧ lcoeff ?g [^] k ⊙ f = ?g ⊗ q ⊕ r ∧ (r = 0∨ deg R r < deg R ?g)" using long_div_theorem [OF _ f deg_nzero_nzero [OF deg_g_nzero]] a by auto thenshow ?thesis unfolding lcoeff_monom [OF a R_not_trivial] unfolding deg_monom_minus [OF a R_not_trivial] using smult_one [OF f] using deg_zero by force qed
lemma remainder_theorem_expression: assumes f [simp]: "f ∈ carrier P"and a [simp]: "a ∈ carrier R" and q [simp]: "q ∈ carrier P"and r [simp]: "r ∈ carrier P" and R_not_trivial: "carrier R ≠ {0}" and f_expr: "f = (monom P 1 1 ⊖ monom P a 0) ⊗ q ⊕ r"
(is"f = ?g ⊗ q ⊕ r"is"f = ?gq ⊕ r") and deg_r_0: "deg R r = 0" shows"r = monom P (eval R R id a f) 0" proof - interpret UP_pre_univ_prop R R id P by standard simp have eval_ring_hom: "eval R R id a ∈ ring_hom P R" using eval_ring_hom [OF a] by simp have"eval R R id a f = eval R R id a ?gq ⊕ eval R R id a r" unfolding f_expr using ring_hom_add [OF eval_ring_hom] by auto alsohave"… = ((eval R R id a ?g) ⊗ (eval R R id a q)) ⊕ eval R R id a r" using ring_hom_mult [OF eval_ring_hom] by auto alsohave"… = 0⊕ eval R R id a r" unfolding eval_monom_expr [OF a] using eval_ring_hom unfolding ring_hom_def using q unfolding Pi_def by simp alsohave"… = eval R R id a r" using eval_ring_hom unfolding ring_hom_def using r unfolding Pi_def by simp finallyhave eval_eq: "eval R R id a f = eval R R id a r"by simp from deg_zero_impl_monom [OF r deg_r_0] have"r = monom P (coeff P r 0) 0"by simp with eval_const [OF a, of "coeff P r 0"] eval_eq show ?thesis by auto qed
corollary remainder_theorem: assumes f [simp]: "f ∈ carrier P"and a [simp]: "a ∈ carrier R" and R_not_trivial: "carrier R ≠ {0}" shows"∃ q r. (q ∈ carrier P) ∧ (r ∈ carrier P) ∧ f = (monom P 1 1 ⊖ monom P a 0) ⊗ q ⊕ monom P (eval R R id a f) 0"
(is"∃ q r. (q ∈ carrier P) ∧ (r ∈ carrier P) ∧ f = ?g ⊗ q ⊕ monom P (eval R R id a f) 0") proof - from remainder_theorem_exist [OF f a R_not_trivial] obtain q r where q_r: "q ∈ carrier P ∧ r ∈ carrier P ∧ f = ?g ⊗ q ⊕ r" and deg_r: "deg R r = 0"by force with remainder_theorem_expression [OF f a _ _ R_not_trivial, of q r] show ?thesis by auto qed
end
subsection‹Sample Application of Evaluation Homomorphism›
lemma UP_pre_univ_propI: assumes"cring R" and"cring S" and"h ∈ ring_hom R S" shows"UP_pre_univ_prop R S h" using assms by (auto intro!: UP_pre_univ_prop.intro ring_hom_cring.intro
ring_hom_cring_axioms.intro UP_cring.intro)
definition
INTEG :: "int ring" where"INTEG = (carrier = UNIV, mult = (*), one = 1, zero = 0, add = (+))"
text‹
Interpretation now enables to import all theorems and lemmas
valid in the context of homomorphisms between term‹INTEG› and term‹UP INTEG› globally. ›
interpretation INTEG: UP_pre_univ_prop INTEG INTEG id "UP INTEG" using INTEG_id_eval by simp_all
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.