src/HOL/Hyperreal/Poly.thy
changeset 25112 98824cc791c0
parent 24742 73b8b42a36b6
child 25134 3d4953e88449
equal deleted inserted replaced
25111:d52a58b51f1f 25112:98824cc791c0
   593 by (induct "p", auto)
   593 by (induct "p", auto)
   594 
   594 
   595 lemma pderiv_aux_iszero_num: "(number_of n :: nat) \<noteq> 0
   595 lemma pderiv_aux_iszero_num: "(number_of n :: nat) \<noteq> 0
   596       ==> (list_all (%c. c = 0) (pderiv_aux (number_of n) p) =
   596       ==> (list_all (%c. c = 0) (pderiv_aux (number_of n) p) =
   597       list_all (%c. c = 0) p)"
   597       list_all (%c. c = 0) p)"
       
   598 unfolding neq0_conv
   598 apply (rule_tac n1 = "number_of n" and m1 = 0 in less_imp_Suc_add [THEN exE], force)
   599 apply (rule_tac n1 = "number_of n" and m1 = 0 in less_imp_Suc_add [THEN exE], force)
   599 apply (rule_tac n1 = "0 + x" in pderiv_aux_iszero [THEN subst])
   600 apply (rule_tac n1 = "0 + x" in pderiv_aux_iszero [THEN subst])
   600 apply (simp (no_asm_simp) del: pderiv_aux_iszero)
   601 apply (simp (no_asm_simp) del: pderiv_aux_iszero)
   601 done
   602 done
   602 
   603 
   791 lemma order_root: "(poly p a = 0) = ((poly p = poly []) | order a p \<noteq> 0)"
   792 lemma order_root: "(poly p a = 0) = ((poly p = poly []) | order a p \<noteq> 0)"
   792 apply (case_tac "poly p = poly []", auto)
   793 apply (case_tac "poly p = poly []", auto)
   793 apply (simp add: poly_linear_divides del: pmult_Cons, safe)
   794 apply (simp add: poly_linear_divides del: pmult_Cons, safe)
   794 apply (drule_tac [!] a = a in order2)
   795 apply (drule_tac [!] a = a in order2)
   795 apply (rule ccontr)
   796 apply (rule ccontr)
   796 apply (simp add: divides_def poly_mult fun_eq del: pmult_Cons, blast)
   797 apply (simp add: divides_def poly_mult fun_eq neq0_conv del: pmult_Cons, blast)
       
   798 using neq0_conv 
   797 apply (blast intro: lemma_order_root)
   799 apply (blast intro: lemma_order_root)
   798 done
   800 done
   799 
   801 
   800 lemma order_divides: "(([-a, 1] %^ n) divides p) = ((poly p = poly []) | n \<le> order a p)"
   802 lemma order_divides: "(([-a, 1] %^ n) divides p) = ((poly p = poly []) | n \<le> order a p)"
   801 apply (case_tac "poly p = poly []", auto)
   803 apply (case_tac "poly p = poly []", auto)
   881 done
   883 done
   882 
   884 
   883 lemma order_pderiv: "[| poly (pderiv p) \<noteq> poly []; order a p \<noteq> 0 |]
   885 lemma order_pderiv: "[| poly (pderiv p) \<noteq> poly []; order a p \<noteq> 0 |]
   884       ==> (order a p = Suc (order a (pderiv p)))"
   886       ==> (order a p = Suc (order a (pderiv p)))"
   885 apply (case_tac "poly p = poly []")
   887 apply (case_tac "poly p = poly []")
   886 apply (auto dest: pderiv_zero)
   888 apply (auto simp add: neq0_conv  dest: pderiv_zero)
   887 apply (drule_tac a = a and p = p in order_decomp)
   889 apply (drule_tac a = a and p = p in order_decomp)
   888 apply (blast intro: lemma_order_pderiv)
   890 apply (blast intro: lemma_order_pderiv)
   889 done
   891 done
   890 
   892 
   891 text{*Now justify the standard squarefree decomposition, i.e. f / gcd(f,f').    *)
   893 text{*Now justify the standard squarefree decomposition, i.e. f / gcd(f,f').    *)
   949 apply (rule allI)
   951 apply (rule allI)
   950 apply (cut_tac p = "[h]" and a = a in order_root)
   952 apply (cut_tac p = "[h]" and a = a in order_root)
   951 apply (simp add: fun_eq)
   953 apply (simp add: fun_eq)
   952 apply (blast intro: order_poly)
   954 apply (blast intro: order_poly)
   953 apply (auto simp add: order_root order_pderiv2)
   955 apply (auto simp add: order_root order_pderiv2)
   954 apply (drule spec, auto)
       
   955 done
   956 done
   956 
   957 
   957 lemma pmult_one: "[1] *** p = p"
   958 lemma pmult_one: "[1] *** p = p"
   958 by auto
   959 by auto
   959 declare pmult_one [simp]
   960 declare pmult_one [simp]