equal
deleted
inserted
replaced
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] |