src/HOL/Hyperreal/Poly.thy
changeset 25162 ad4d5365d9d8
parent 25157 8b80535cd017
child 26316 9e9e67e33557
equal deleted inserted replaced
25161:aa8474398030 25162:ad4d5365d9d8
   780 apply (auto simp add: numeral_1_eq_1)
   780 apply (auto simp add: numeral_1_eq_1)
   781 done
   781 done
   782 declare pexp_one [simp]
   782 declare pexp_one [simp]
   783 
   783 
   784 lemma lemma_order_root [rule_format]:
   784 lemma lemma_order_root [rule_format]:
   785      "\<forall>p a. n \<noteq> 0 & [- a, 1] %^ n divides p & ~ [- a, 1] %^ (Suc n) divides p
   785      "\<forall>p a. n > 0 & [- a, 1] %^ n divides p & ~ [- a, 1] %^ (Suc n) divides p
   786              --> poly p a = 0"
   786              --> poly p a = 0"
   787 apply (induct "n", blast)
   787 apply (induct "n", blast)
   788 apply (auto simp add: divides_def poly_mult simp del: pmult_Cons)
   788 apply (auto simp add: divides_def poly_mult simp del: pmult_Cons)
   789 done
   789 done
   790 
   790 
   791 lemma order_root: "(poly p a = 0) = ((poly p = poly []) | order a p \<noteq> 0)"
   791 lemma order_root: "(poly p a = 0) = ((poly p = poly []) | order a p \<noteq> 0)"
   792 apply (case_tac "poly p = poly []", auto)
   792 apply (case_tac "poly p = poly []", auto)
   793 apply (simp add: poly_linear_divides del: pmult_Cons, safe)
   793 apply (simp add: poly_linear_divides del: pmult_Cons, safe)
   794 apply (drule_tac [!] a = a in order2)
   794 apply (drule_tac [!] a = a in order2)
       
   795 apply (rule ccontr)
   795 apply (simp add: divides_def poly_mult fun_eq del: pmult_Cons, blast)
   796 apply (simp add: divides_def poly_mult fun_eq del: pmult_Cons, blast)
   796 apply (metis gr0_conv lemma_order_root)
   797 apply (blast intro: lemma_order_root)
   797 done
   798 done
   798 
   799 
   799 lemma order_divides: "(([-a, 1] %^ n) divides p) = ((poly p = poly []) | n \<le> order a p)"
   800 lemma order_divides: "(([-a, 1] %^ n) divides p) = ((poly p = poly []) | n \<le> order a p)"
   800 apply (case_tac "poly p = poly []", auto)
   801 apply (case_tac "poly p = poly []", auto)
   801 apply (simp add: divides_def fun_eq poly_mult)
   802 apply (simp add: divides_def fun_eq poly_mult)
   840 apply (simp add: fun_eq poly_exp_add poly_mult mult_ac del: pmult_Cons)
   841 apply (simp add: fun_eq poly_exp_add poly_mult mult_ac del: pmult_Cons)
   841 done
   842 done
   842 
   843 
   843 (* FIXME: too too long! *)
   844 (* FIXME: too too long! *)
   844 lemma lemma_order_pderiv [rule_format]:
   845 lemma lemma_order_pderiv [rule_format]:
   845      "\<forall>p q a. n \<noteq> 0 &
   846      "\<forall>p q a. n > 0 &
   846        poly (pderiv p) \<noteq> poly [] &
   847        poly (pderiv p) \<noteq> poly [] &
   847        poly p = poly ([- a, 1] %^ n *** q) & ~ [- a, 1] divides q
   848        poly p = poly ([- a, 1] %^ n *** q) & ~ [- a, 1] divides q
   848        --> n = Suc (order a (pderiv p))"
   849        --> n = Suc (order a (pderiv p))"
   849 apply (induct "n", safe)
   850 apply (induct "n", safe)
   850 apply (rule order_unique_lemma, rule conjI, assumption)
   851 apply (rule order_unique_lemma, rule conjI, assumption)