src/HOL/Algebra/UnivPoly.thy
changeset 23350 50c5b0912a0c
parent 22931 11cc1ccad58e
child 26202 51f8a696cd8d
equal deleted inserted replaced
23349:23a8345f89f5 23350:50c5b0912a0c
   304     proof (induct k)
   304     proof (induct k)
   305       case 0 then show ?case by (simp add: Pi_def m_assoc)
   305       case 0 then show ?case by (simp add: Pi_def m_assoc)
   306     next
   306     next
   307       case (Suc k)
   307       case (Suc k)
   308       then have "k <= n" by arith
   308       then have "k <= n" by arith
   309       then have "?eq k" by (rule Suc)
   309       from this R have "?eq k" by (rule Suc)
   310       with R show ?case
   310       with R show ?case
   311         by (simp cong: finsum_cong
   311         by (simp cong: finsum_cong
   312              add: Suc_diff_le Pi_def l_distr r_distr m_assoc)
   312              add: Suc_diff_le Pi_def l_distr r_distr m_assoc)
   313           (simp cong: finsum_cong add: Pi_def a_ac finsum_ldistr m_assoc)
   313           (simp cong: finsum_cong add: Pi_def a_ac finsum_ldistr m_assoc)
   314     qed
   314     qed
   631   with prem show P .
   631   with prem show P .
   632 qed
   632 qed
   633 *)
   633 *)
   634 
   634 
   635 lemma (in UP_cring) deg_aboveD:
   635 lemma (in UP_cring) deg_aboveD:
   636   "[| deg R p < m; p \<in> carrier P |] ==> coeff P p m = \<zero>"
   636   assumes "deg R p < m" and "p \<in> carrier P"
   637 proof -
   637   shows "coeff P p m = \<zero>"
   638   assume R: "p \<in> carrier P" and "deg R p < m"
   638 proof -
   639   from R obtain n where "bound \<zero> n (coeff P p)"
   639   from `p \<in> carrier P` obtain n where "bound \<zero> n (coeff P p)"
   640     by (auto simp add: UP_def P_def)
   640     by (auto simp add: UP_def P_def)
   641   then have "bound \<zero> (deg R p) (coeff P p)"
   641   then have "bound \<zero> (deg R p) (coeff P p)"
   642     by (auto simp: deg_def P_def dest: LeastI)
   642     by (auto simp: deg_def P_def dest: LeastI)
   643   then show ?thesis ..
   643   from this and `deg R p < m` show ?thesis ..
   644 qed
   644 qed
   645 
   645 
   646 lemma (in UP_cring) deg_belowI:
   646 lemma (in UP_cring) deg_belowI:
   647   assumes non_zero: "n ~= 0 ==> coeff P p n ~= \<zero>"
   647   assumes non_zero: "n ~= 0 ==> coeff P p n ~= \<zero>"
   648     and R: "p \<in> carrier P"
   648     and R: "p \<in> carrier P"
   670       by (unfold deg_def P_def) arith
   670       by (unfold deg_def P_def) arith
   671     then have "~ bound \<zero> (deg R p - 1) (coeff P p)" by (rule not_less_Least)
   671     then have "~ bound \<zero> (deg R p - 1) (coeff P p)" by (rule not_less_Least)
   672     then have "EX m. deg R p - 1 < m & coeff P p m ~= \<zero>"
   672     then have "EX m. deg R p - 1 < m & coeff P p m ~= \<zero>"
   673       by (unfold bound_def) fast
   673       by (unfold bound_def) fast
   674     then have "EX m. deg R p <= m & coeff P p m ~= \<zero>" by (simp add: deg minus)
   674     then have "EX m. deg R p <= m & coeff P p m ~= \<zero>" by (simp add: deg minus)
   675     then show ?thesis by auto
   675     then show ?thesis by (auto intro: that)
   676   qed
   676   qed
   677   with deg_belowI R have "deg R p = m" by fastsimp
   677   with deg_belowI R have "deg R p = m" by fastsimp
   678   with m_coeff show ?thesis by simp
   678   with m_coeff show ?thesis by simp
   679 qed
   679 qed
   680 
   680 
   687     assume "~ ?thesis"
   687     assume "~ ?thesis"
   688     with R have "p = \<zero>\<^bsub>P\<^esub>" by (auto intro: up_eqI)
   688     with R have "p = \<zero>\<^bsub>P\<^esub>" by (auto intro: up_eqI)
   689     with nonzero show ?thesis by contradiction
   689     with nonzero show ?thesis by contradiction
   690   qed
   690   qed
   691   then obtain m where coeff: "coeff P p m ~= \<zero>" ..
   691   then obtain m where coeff: "coeff P p m ~= \<zero>" ..
   692   then have "m <= deg R p" by (rule deg_belowI)
   692   from this and R have "m <= deg R p" by (rule deg_belowI)
   693   then have "m = 0" by (simp add: deg)
   693   then have "m = 0" by (simp add: deg)
   694   with coeff show ?thesis by simp
   694   with coeff show ?thesis by simp
   695 qed
   695 qed
   696 
   696 
   697 lemma (in UP_cring) lcoeff_nonzero:
   697 lemma (in UP_cring) lcoeff_nonzero:
   771 lemma (in UP_domain) deg_smult [simp]:
   771 lemma (in UP_domain) deg_smult [simp]:
   772   assumes R: "a \<in> carrier R" "p \<in> carrier P"
   772   assumes R: "a \<in> carrier R" "p \<in> carrier P"
   773   shows "deg R (a \<odot>\<^bsub>P\<^esub> p) = (if a = \<zero> then 0 else deg R p)"
   773   shows "deg R (a \<odot>\<^bsub>P\<^esub> p) = (if a = \<zero> then 0 else deg R p)"
   774 proof (rule le_anti_sym)
   774 proof (rule le_anti_sym)
   775   show "deg R (a \<odot>\<^bsub>P\<^esub> p) <= (if a = \<zero> then 0 else deg R p)"
   775   show "deg R (a \<odot>\<^bsub>P\<^esub> p) <= (if a = \<zero> then 0 else deg R p)"
   776     by (rule deg_smult_ring)
   776     using R by (rule deg_smult_ring)
   777 next
   777 next
   778   show "(if a = \<zero> then 0 else deg R p) <= deg R (a \<odot>\<^bsub>P\<^esub> p)"
   778   show "(if a = \<zero> then 0 else deg R p) <= deg R (a \<odot>\<^bsub>P\<^esub> p)"
   779   proof (cases "a = \<zero>")
   779   proof (cases "a = \<zero>")
   780   qed (simp, simp add: deg_belowI lcoeff_nonzero_deg integral_iff R)
   780   qed (simp, simp add: deg_belowI lcoeff_nonzero_deg integral_iff R)
   781 qed
   781 qed
   803 lemma (in UP_domain) deg_mult [simp]:
   803 lemma (in UP_domain) deg_mult [simp]:
   804   "[| p ~= \<zero>\<^bsub>P\<^esub>; q ~= \<zero>\<^bsub>P\<^esub>; p \<in> carrier P; q \<in> carrier P |] ==>
   804   "[| p ~= \<zero>\<^bsub>P\<^esub>; q ~= \<zero>\<^bsub>P\<^esub>; p \<in> carrier P; q \<in> carrier P |] ==>
   805   deg R (p \<otimes>\<^bsub>P\<^esub> q) = deg R p + deg R q"
   805   deg R (p \<otimes>\<^bsub>P\<^esub> q) = deg R p + deg R q"
   806 proof (rule le_anti_sym)
   806 proof (rule le_anti_sym)
   807   assume "p \<in> carrier P" " q \<in> carrier P"
   807   assume "p \<in> carrier P" " q \<in> carrier P"
   808   show "deg R (p \<otimes>\<^bsub>P\<^esub> q) <= deg R p + deg R q" by (rule deg_mult_cring)
   808   then show "deg R (p \<otimes>\<^bsub>P\<^esub> q) <= deg R p + deg R q" by (rule deg_mult_cring)
   809 next
   809 next
   810   let ?s = "(%i. coeff P p i \<otimes> coeff P q (deg R p + deg R q - i))"
   810   let ?s = "(%i. coeff P p i \<otimes> coeff P q (deg R p + deg R q - i))"
   811   assume R: "p \<in> carrier P" "q \<in> carrier P" and nz: "p ~= \<zero>\<^bsub>P\<^esub>" "q ~= \<zero>\<^bsub>P\<^esub>"
   811   assume R: "p \<in> carrier P" "q \<in> carrier P" and nz: "p ~= \<zero>\<^bsub>P\<^esub>" "q ~= \<zero>\<^bsub>P\<^esub>"
   812   have less_add_diff: "!!(k::nat) n m. k < n ==> m < n + m - k" by arith
   812   have less_add_diff: "!!(k::nat) n m. k < n ==> m < n + m - k" by arith
   813   show "deg R p + deg R q <= deg R (p \<otimes>\<^bsub>P\<^esub> q)"
   813   show "deg R p + deg R q <= deg R (p \<otimes>\<^bsub>P\<^esub> q)"
   882   then have "finsum P ?s {..n} = finsum P ?s ({..deg R p} \<union> {deg R p<..n})"
   882   then have "finsum P ?s {..n} = finsum P ?s ({..deg R p} \<union> {deg R p<..n})"
   883     by (simp only: ivl_disj_un_one)
   883     by (simp only: ivl_disj_un_one)
   884   also have "... = finsum P ?s {..deg R p}"
   884   also have "... = finsum P ?s {..deg R p}"
   885     by (simp cong: P.finsum_cong add: P.finsum_Un_disjoint ivl_disj_int_one
   885     by (simp cong: P.finsum_cong add: P.finsum_Un_disjoint ivl_disj_int_one
   886       deg_aboveD R Pi_def)
   886       deg_aboveD R Pi_def)
   887   also have "... = p" by (rule up_repr)
   887   also have "... = p" using R by (rule up_repr)
   888   finally show ?thesis .
   888   finally show ?thesis .
   889 qed
   889 qed
   890 
   890 
   891 
   891 
   892 subsection {* Polynomials over Integral Domains *}
   892 subsection {* Polynomials over Integral Domains *}
  1299 lemma UP_pre_univ_propI:
  1299 lemma UP_pre_univ_propI:
  1300   assumes "cring R"
  1300   assumes "cring R"
  1301     and "cring S"
  1301     and "cring S"
  1302     and "h \<in> ring_hom R S"
  1302     and "h \<in> ring_hom R S"
  1303   shows "UP_pre_univ_prop R S h"
  1303   shows "UP_pre_univ_prop R S h"
       
  1304   using assms
  1304   by (auto intro!: UP_pre_univ_prop.intro ring_hom_cring.intro
  1305   by (auto intro!: UP_pre_univ_prop.intro ring_hom_cring.intro
  1305     ring_hom_cring_axioms.intro UP_cring.intro)
  1306     ring_hom_cring_axioms.intro UP_cring.intro)
  1306 
  1307 
  1307 constdefs
  1308 constdefs
  1308   INTEG :: "int ring"
  1309   INTEG :: "int ring"