src/HOL/Computational_Algebra/Polynomial.thy
changeset 65486 d801126a14cb
parent 65484 751f9ed8e940
child 65577 32d4117ad6e8
equal deleted inserted replaced
65485:8c7bc3a13513 65486:d801126a14cb
   996   by (induct m) (simp add: monom_0 smult_monom, simp add: monom_Suc)
   996   by (induct m) (simp add: monom_0 smult_monom, simp add: monom_Suc)
   997 
   997 
   998 instantiation poly :: (comm_semiring_1) comm_semiring_1
   998 instantiation poly :: (comm_semiring_1) comm_semiring_1
   999 begin
   999 begin
  1000 
  1000 
  1001 definition one_poly_def: "1 = pCons 1 0"
  1001 lift_definition one_poly :: "'a poly"
       
  1002   is "\<lambda>n. of_bool (n = 0)"
       
  1003   by (rule MOST_SucD) simp
       
  1004 
       
  1005 lemma coeff_1 [simp]:
       
  1006   "coeff 1 n = of_bool (n = 0)"
       
  1007   by (simp add: one_poly.rep_eq)
       
  1008 
       
  1009 lemma one_pCons:
       
  1010   "1 = [:1:]"
       
  1011   by (simp add: poly_eq_iff coeff_pCons split: nat.splits)
       
  1012 
       
  1013 lemma pCons_one:
       
  1014   "[:1:] = 1"
       
  1015   by (simp add: one_pCons)
  1002 
  1016 
  1003 instance
  1017 instance
  1004 proof
  1018   by standard (simp_all add: one_pCons)
  1005   show "1 * p = p" for p :: "'a poly"
       
  1006     by (simp add: one_poly_def)
       
  1007   show "0 \<noteq> (1::'a poly)"
       
  1008     by (simp add: one_poly_def)
       
  1009 qed
       
  1010 
  1019 
  1011 end
  1020 end
       
  1021 
       
  1022 lemma poly_1 [simp]:
       
  1023   "poly 1 x = 1"
       
  1024   by (simp add: one_pCons)
       
  1025 
       
  1026 lemma one_poly_eq_simps [simp]:
       
  1027   "1 = [:1:] \<longleftrightarrow> True"
       
  1028   "[:1:] = 1 \<longleftrightarrow> True"
       
  1029   by (simp_all add: one_pCons)
       
  1030 
       
  1031 lemma degree_1 [simp]:
       
  1032   "degree 1 = 0"
       
  1033   by (simp add: one_pCons)
       
  1034 
       
  1035 lemma coeffs_1_eq [simp, code abstract]:
       
  1036   "coeffs 1 = [1]"
       
  1037   by (simp add: one_pCons)
       
  1038 
       
  1039 lemma smult_one [simp]:
       
  1040   "smult c 1 = [:c:]"
       
  1041   by (simp add: one_pCons)
       
  1042 
       
  1043 lemma monom_eq_1 [simp]:
       
  1044   "monom 1 0 = 1"
       
  1045   by (simp add: monom_0 one_pCons)
       
  1046 
       
  1047 lemma monom_eq_1_iff:
       
  1048   "monom c n = 1 \<longleftrightarrow> c = 1 \<and> n = 0"
       
  1049   using monom_eq_const_iff [of c n 1] by auto
       
  1050 
       
  1051 lemma monom_altdef:
       
  1052   "monom c n = smult c ([:0, 1:] ^ n)"
       
  1053   by (induct n) (simp_all add: monom_0 monom_Suc)  
  1012 
  1054 
  1013 instance poly :: ("{comm_semiring_1,semiring_1_no_zero_divisors}") semiring_1_no_zero_divisors ..
  1055 instance poly :: ("{comm_semiring_1,semiring_1_no_zero_divisors}") semiring_1_no_zero_divisors ..
  1014 instance poly :: (comm_ring) comm_ring ..
  1056 instance poly :: (comm_ring) comm_ring ..
  1015 instance poly :: (comm_ring_1) comm_ring_1 ..
  1057 instance poly :: (comm_ring_1) comm_ring_1 ..
  1016 instance poly :: (comm_ring_1) comm_semiring_1_cancel ..
  1058 instance poly :: (comm_ring_1) comm_semiring_1_cancel ..
  1017 
  1059 
  1018 lemma coeff_1 [simp]: "coeff 1 n = (if n = 0 then 1 else 0)"
       
  1019   by (simp add: one_poly_def coeff_pCons split: nat.split)
       
  1020 
       
  1021 lemma monom_eq_1 [simp]: "monom 1 0 = 1"
       
  1022   by (simp add: monom_0 one_poly_def)
       
  1023 
       
  1024 lemma monom_eq_1_iff: "monom c n = 1 \<longleftrightarrow> c = 1 \<and> n = 0"
       
  1025   using monom_eq_const_iff[of c n 1] by (auto simp: one_poly_def)
       
  1026 
       
  1027 lemma monom_altdef: "monom c n = smult c ([:0, 1:]^n)"
       
  1028   by (induct n) (simp_all add: monom_0 monom_Suc one_poly_def)
       
  1029 
       
  1030 lemma degree_1 [simp]: "degree 1 = 0"
       
  1031   unfolding one_poly_def by (rule degree_pCons_0)
       
  1032 
       
  1033 lemma coeffs_1_eq [simp, code abstract]: "coeffs 1 = [1]"
       
  1034   by (simp add: one_poly_def)
       
  1035 
       
  1036 lemma degree_power_le: "degree (p ^ n) \<le> degree p * n"
  1060 lemma degree_power_le: "degree (p ^ n) \<le> degree p * n"
  1037   by (induct n) (auto intro: order_trans degree_mult_le)
  1061   by (induct n) (auto intro: order_trans degree_mult_le)
  1038 
  1062 
  1039 lemma coeff_0_power: "coeff (p ^ n) 0 = coeff p 0 ^ n"
  1063 lemma coeff_0_power: "coeff (p ^ n) 0 = coeff p 0 ^ n"
  1040   by (induct n) (simp_all add: coeff_mult)
  1064   by (induct n) (simp_all add: coeff_mult)
  1042 lemma poly_smult [simp]: "poly (smult a p) x = a * poly p x"
  1066 lemma poly_smult [simp]: "poly (smult a p) x = a * poly p x"
  1043   by (induct p) (simp_all add: algebra_simps)
  1067   by (induct p) (simp_all add: algebra_simps)
  1044 
  1068 
  1045 lemma poly_mult [simp]: "poly (p * q) x = poly p x * poly q x"
  1069 lemma poly_mult [simp]: "poly (p * q) x = poly p x * poly q x"
  1046   by (induct p) (simp_all add: algebra_simps)
  1070   by (induct p) (simp_all add: algebra_simps)
  1047 
       
  1048 lemma poly_1 [simp]: "poly 1 x = 1"
       
  1049   by (simp add: one_poly_def)
       
  1050 
  1071 
  1051 lemma poly_power [simp]: "poly (p ^ n) x = poly p x ^ n"
  1072 lemma poly_power [simp]: "poly (p ^ n) x = poly p x ^ n"
  1052   for p :: "'a::comm_semiring_1 poly"
  1073   for p :: "'a::comm_semiring_1 poly"
  1053   by (induct n) simp_all
  1074   by (induct n) simp_all
  1054 
  1075 
  1111 
  1132 
  1112 lemma map_poly_1: "map_poly f 1 = [:f 1:]"
  1133 lemma map_poly_1: "map_poly f 1 = [:f 1:]"
  1113   by (simp add: map_poly_def)
  1134   by (simp add: map_poly_def)
  1114 
  1135 
  1115 lemma map_poly_1' [simp]: "f 1 = 1 \<Longrightarrow> map_poly f 1 = 1"
  1136 lemma map_poly_1' [simp]: "f 1 = 1 \<Longrightarrow> map_poly f 1 = 1"
  1116   by (simp add: map_poly_def one_poly_def)
  1137   by (simp add: map_poly_def one_pCons)
  1117 
  1138 
  1118 lemma coeff_map_poly:
  1139 lemma coeff_map_poly:
  1119   assumes "f 0 = 0"
  1140   assumes "f 0 = 0"
  1120   shows "coeff (map_poly f p) n = f (coeff p n)"
  1141   shows "coeff (map_poly f p) n = f (coeff p n)"
  1121   by (auto simp: assms map_poly_def nth_default_def coeffs_def not_less Suc_le_eq coeff_eq_0
  1142   by (auto simp: assms map_poly_def nth_default_def coeffs_def not_less Suc_le_eq coeff_eq_0
  1215 
  1236 
  1216 subsection \<open>Conversions\<close>
  1237 subsection \<open>Conversions\<close>
  1217 
  1238 
  1218 lemma of_nat_poly:
  1239 lemma of_nat_poly:
  1219   "of_nat n = [:of_nat n:]"
  1240   "of_nat n = [:of_nat n:]"
  1220   by (induct n) (simp_all add: one_poly_def)
  1241   by (induct n) (simp_all add: one_pCons)
  1221 
  1242 
  1222 lemma of_nat_monom:
  1243 lemma of_nat_monom:
  1223   "of_nat n = monom (of_nat n) 0"
  1244   "of_nat n = monom (of_nat n) 0"
  1224   by (simp add: of_nat_poly monom_0)
  1245   by (simp add: of_nat_poly monom_0)
  1225 
  1246 
  1326   next
  1347   next
  1327     assume "c dvd 1" "p dvd 1"
  1348     assume "c dvd 1" "p dvd 1"
  1328     from this(1) obtain d where "1 = c * d"
  1349     from this(1) obtain d where "1 = c * d"
  1329       by (rule dvdE)
  1350       by (rule dvdE)
  1330     then have "1 = [:c:] * [:d:]"
  1351     then have "1 = [:c:] * [:d:]"
  1331       by (simp add: one_poly_def mult_ac)
  1352       by (simp add: one_pCons ac_simps)
  1332     then have "[:c:] dvd 1"
  1353     then have "[:c:] dvd 1"
  1333       by (rule dvdI)
  1354       by (rule dvdI)
  1334     from mult_dvd_mono[OF this \<open>p dvd 1\<close>] show "[:c:] * p dvd 1"
  1355     from mult_dvd_mono[OF this \<open>p dvd 1\<close>] show "[:c:] * p dvd 1"
  1335       by simp
  1356       by simp
  1336   qed
  1357   qed
  1950 lemma pcompose_pCons: "pcompose (pCons a p) q = [:a:] + q * pcompose p q"
  1971 lemma pcompose_pCons: "pcompose (pCons a p) q = [:a:] + q * pcompose p q"
  1951   by (cases "p = 0 \<and> a = 0") (auto simp add: pcompose_def)
  1972   by (cases "p = 0 \<and> a = 0") (auto simp add: pcompose_def)
  1952 
  1973 
  1953 lemma pcompose_1: "pcompose 1 p = 1"
  1974 lemma pcompose_1: "pcompose 1 p = 1"
  1954   for p :: "'a::comm_semiring_1 poly"
  1975   for p :: "'a::comm_semiring_1 poly"
  1955   by (auto simp: one_poly_def pcompose_pCons)
  1976   by (auto simp: one_pCons pcompose_pCons)
  1956 
  1977 
  1957 lemma poly_pcompose: "poly (pcompose p q) x = poly p (poly q x)"
  1978 lemma poly_pcompose: "poly (pcompose p q) x = poly p (poly q x)"
  1958   by (induct p) (simp_all add: pcompose_pCons)
  1979   by (induct p) (simp_all add: pcompose_pCons)
  1959 
  1980 
  1960 lemma degree_pcompose_le: "degree (pcompose p q) \<le> degree p * degree q"
  1981 lemma degree_pcompose_le: "degree (pcompose p q) \<le> degree p * degree q"
  2223 
  2244 
  2224 lemma reflect_poly_0 [simp]: "reflect_poly 0 = 0"
  2245 lemma reflect_poly_0 [simp]: "reflect_poly 0 = 0"
  2225   by (simp add: reflect_poly_def)
  2246   by (simp add: reflect_poly_def)
  2226 
  2247 
  2227 lemma reflect_poly_1 [simp]: "reflect_poly 1 = 1"
  2248 lemma reflect_poly_1 [simp]: "reflect_poly 1 = 1"
  2228   by (simp add: reflect_poly_def one_poly_def)
  2249   by (simp add: reflect_poly_def one_pCons)
  2229 
  2250 
  2230 lemma coeff_reflect_poly:
  2251 lemma coeff_reflect_poly:
  2231   "coeff (reflect_poly p) n = (if n > degree p then 0 else coeff p (degree p - n))"
  2252   "coeff (reflect_poly p) n = (if n > degree p then 0 else coeff p (degree p - n))"
  2232   by (cases "p = 0")
  2253   by (cases "p = 0")
  2233     (auto simp add: reflect_poly_def nth_default_def
  2254     (auto simp add: reflect_poly_def nth_default_def
  2349 
  2370 
  2350 lemma pderiv_pCons: "pderiv (pCons a p) = p + pCons 0 (pderiv p)"
  2371 lemma pderiv_pCons: "pderiv (pCons a p) = p + pCons 0 (pderiv p)"
  2351   by (simp add: pderiv.simps)
  2372   by (simp add: pderiv.simps)
  2352 
  2373 
  2353 lemma pderiv_1 [simp]: "pderiv 1 = 0"
  2374 lemma pderiv_1 [simp]: "pderiv 1 = 0"
  2354   by (simp add: one_poly_def pderiv_pCons)
  2375   by (simp add: one_pCons pderiv_pCons)
  2355 
  2376 
  2356 lemma pderiv_of_nat [simp]: "pderiv (of_nat n) = 0"
  2377 lemma pderiv_of_nat [simp]: "pderiv (of_nat n) = 0"
  2357   and pderiv_numeral [simp]: "pderiv (numeral m) = 0"
  2378   and pderiv_numeral [simp]: "pderiv (numeral m) = 0"
  2358   by (simp_all add: of_nat_poly numeral_poly pderiv_pCons)
  2379   by (simp_all add: of_nat_poly numeral_poly pderiv_pCons)
  2359 
  2380 
  3240   for p :: "'a::field poly"
  3261   for p :: "'a::field poly"
  3241   by (cases p) (simp_all add: monom_0 is_unit_pCons_iff)
  3262   by (cases p) (simp_all add: monom_0 is_unit_pCons_iff)
  3242 
  3263 
  3243 lemma is_unit_const_poly_iff: "[:c:] dvd 1 \<longleftrightarrow> c dvd 1"
  3264 lemma is_unit_const_poly_iff: "[:c:] dvd 1 \<longleftrightarrow> c dvd 1"
  3244   for c :: "'a::{comm_semiring_1,semiring_no_zero_divisors}"
  3265   for c :: "'a::{comm_semiring_1,semiring_no_zero_divisors}"
  3245   by (auto simp: one_poly_def)
  3266   by (auto simp: one_pCons)
  3246 
  3267 
  3247 lemma is_unit_polyE:
  3268 lemma is_unit_polyE:
  3248   fixes p :: "'a :: {comm_semiring_1,semiring_no_zero_divisors} poly"
  3269   fixes p :: "'a :: {comm_semiring_1,semiring_no_zero_divisors} poly"
  3249   assumes "p dvd 1"
  3270   assumes "p dvd 1"
  3250   obtains c where "p = [:c:]" "c dvd 1"
  3271   obtains c where "p = [:c:]" "c dvd 1"