diff -r 028edb1e5b99 -r e0237f2eb49d src/HOL/Computational_Algebra/Polynomial.thy --- a/src/HOL/Computational_Algebra/Polynomial.thy Sun Jan 19 14:50:03 2020 +0100 +++ b/src/HOL/Computational_Algebra/Polynomial.thy Tue Jan 21 11:02:27 2020 +0100 @@ -3445,10 +3445,18 @@ assume "p \ 0" then show "is_unit (unit_factor p)" by (simp add: unit_factor_poly_def monom_0 is_unit_poly_iff unit_factor_is_unit) +next + fix a b :: "'a poly" assume "is_unit a" + thus "unit_factor (a * b) = a * unit_factor b" + by (auto simp: unit_factor_poly_def lead_coeff_mult unit_factor_mult elim!: is_unit_polyE) qed (simp_all add: normalize_poly_def unit_factor_poly_def monom_0 lead_coeff_mult unit_factor_mult) end +instance poly :: ("{semidom_divide_unit_factor,idom_divide,normalization_semidom_multiplicative}") + normalization_semidom_multiplicative + by intro_classes (auto simp: unit_factor_poly_def lead_coeff_mult unit_factor_mult) + lemma normalize_poly_eq_map_poly: "normalize p = map_poly (\x. x div unit_factor (lead_coeff p)) p" proof - have "[:unit_factor (lead_coeff p):] dvd p" @@ -3489,7 +3497,9 @@ lemma normalize_const_poly: "normalize [:c:] = [:normalize c:]" by (simp add: normalize_poly_eq_map_poly map_poly_pCons) -lemma normalize_smult: "normalize (smult c p) = smult (normalize c) (normalize p)" +lemma normalize_smult: + fixes c :: "'a :: {normalization_semidom_multiplicative, idom_divide}" + shows "normalize (smult c p) = smult (normalize c) (normalize p)" proof - have "smult c p = [:c:] * p" by simp also have "normalize \ = smult (normalize c) (normalize p)" @@ -4488,8 +4498,10 @@ then show "content p = 1" by simp qed auto -lemma content_smult [simp]: "content (smult c p) = normalize c * content p" - by (simp add: content_def coeffs_smult Gcd_fin_mult) +lemma content_smult [simp]: + fixes c :: "'a :: {normalization_semidom_multiplicative, semiring_gcd}" + shows "content (smult c p) = normalize c * content p" + by (simp add: content_def coeffs_smult Gcd_fin_mult normalize_mult) lemma content_eq_zero_iff [simp]: "content p = 0 \ p = 0" by (auto simp: content_def simp: poly_eq_iff coeffs_def) @@ -4528,6 +4540,7 @@ qed lemma content_primitive_part [simp]: + fixes p :: "'a :: {normalization_semidom_multiplicative, semiring_gcd} poly" assumes "p \ 0" shows "content (primitive_part p) = 1" proof - @@ -4544,7 +4557,7 @@ qed lemma content_decompose: - obtains p' :: "'a::semiring_gcd poly" + obtains p' :: "'a :: {normalization_semidom_multiplicative, semiring_gcd} poly" where "p = smult (content p) p'" "content p' = 1" proof (cases "p = 0") case True @@ -4581,7 +4594,8 @@ qed lemma smult_content_normalize_primitive_part [simp]: - "smult (content p) (normalize (primitive_part p)) = normalize p" + fixes p :: "'a :: {normalization_semidom_multiplicative, semiring_gcd, idom_divide} poly" + shows "smult (content p) (normalize (primitive_part p)) = normalize p" proof - have "smult (content p) (normalize (primitive_part p)) = normalize ([:content p:] * primitive_part p)" @@ -4623,7 +4637,7 @@ qed (insert assms, auto) lemma content_mult: - fixes p q :: "'a :: {factorial_semiring, semiring_gcd} poly" + fixes p q :: "'a :: {factorial_semiring, semiring_gcd, normalization_semidom_multiplicative} poly" shows "content (p * q) = content p * content q" proof (cases "p * q = 0") case False @@ -4646,7 +4660,8 @@ end lemma primitive_part_mult: - fixes p q :: "'a :: {factorial_semiring, semiring_Gcd, ring_gcd, idom_divide} poly" + fixes p q :: "'a :: {factorial_semiring, semiring_Gcd, ring_gcd, idom_divide, + normalization_semidom_multiplicative} poly" shows "primitive_part (p * q) = primitive_part p * primitive_part q" proof - have "primitive_part (p * q) = p * q div [:content (p * q):]" @@ -4659,7 +4674,8 @@ qed lemma primitive_part_smult: - fixes p :: "'a :: {factorial_semiring, semiring_Gcd, ring_gcd, idom_divide} poly" + fixes p :: "'a :: {factorial_semiring, semiring_Gcd, ring_gcd, idom_divide, + normalization_semidom_multiplicative} poly" shows "primitive_part (smult a p) = smult (unit_factor a) (primitive_part p)" proof - have "smult a p = [:a:] * p" by simp @@ -4669,17 +4685,19 @@ qed lemma primitive_part_dvd_primitive_partI [intro]: - fixes p q :: "'a :: {factorial_semiring, semiring_Gcd, ring_gcd, idom_divide} poly" + fixes p q :: "'a :: {factorial_semiring, semiring_Gcd, ring_gcd, idom_divide, + normalization_semidom_multiplicative} poly" shows "p dvd q \ primitive_part p dvd primitive_part q" by (auto elim!: dvdE simp: primitive_part_mult) lemma content_prod_mset: - fixes A :: "'a :: {factorial_semiring, semiring_Gcd} poly multiset" + fixes A :: "'a :: {factorial_semiring, semiring_Gcd, normalization_semidom_multiplicative} + poly multiset" shows "content (prod_mset A) = prod_mset (image_mset content A)" by (induction A) (simp_all add: content_mult mult_ac) lemma content_prod_eq_1_iff: - fixes p q :: "'a :: {factorial_semiring, semiring_Gcd} poly" + fixes p q :: "'a :: {factorial_semiring, semiring_Gcd, normalization_semidom_multiplicative} poly" shows "content (p * q) = 1 \ content p = 1 \ content q = 1" proof safe assume A: "content (p * q) = 1"