# HG changeset patch # User paulson # Date 1530608844 -3600 # Node ID 654e73d05495c2f39b25ea2491c4dd9f977899d1 # Parent a3723b11bd60390b9948e1586104cda57c6fdbee even more from Paulo diff -r a3723b11bd60 -r 654e73d05495 src/HOL/Algebra/Multiplicative_Group.thy --- a/src/HOL/Algebra/Multiplicative_Group.thy Tue Jul 03 00:15:16 2018 +0100 +++ b/src/HOL/Algebra/Multiplicative_Group.thy Tue Jul 03 10:07:24 2018 +0100 @@ -609,16 +609,16 @@ definition mult_of :: "('a, 'b) ring_scheme \ 'a monoid" where "mult_of R \ \ carrier = carrier R - {\\<^bsub>R\<^esub>}, mult = mult R, one = \\<^bsub>R\<^esub>\" -lemma carrier_mult_of: "carrier (mult_of R) = carrier R - {\\<^bsub>R\<^esub>}" +lemma carrier_mult_of [simp]: "carrier (mult_of R) = carrier R - {\\<^bsub>R\<^esub>}" by (simp add: mult_of_def) -lemma mult_mult_of: "mult (mult_of R) = mult R" +lemma mult_mult_of [simp]: "mult (mult_of R) = mult R" by (simp add: mult_of_def) lemma nat_pow_mult_of: "([^]\<^bsub>mult_of R\<^esub>) = (([^]\<^bsub>R\<^esub>) :: _ \ nat \ _)" by (simp add: mult_of_def fun_eq_iff nat_pow_def) -lemma one_mult_of: "\\<^bsub>mult_of R\<^esub> = \\<^bsub>R\<^esub>" +lemma one_mult_of [simp]: "\\<^bsub>mult_of R\<^esub> = \\<^bsub>R\<^esub>" by (simp add: mult_of_def) lemmas mult_of_simps = carrier_mult_of mult_mult_of nat_pow_mult_of one_mult_of diff -r a3723b11bd60 -r 654e73d05495 src/HOL/Algebra/Polynomials.thy --- a/src/HOL/Algebra/Polynomials.thy Tue Jul 03 00:15:16 2018 +0100 +++ b/src/HOL/Algebra/Polynomials.thy Tue Jul 03 10:07:24 2018 +0100 @@ -127,7 +127,7 @@ using degree_def[of "a # p"] by auto also have " ... = a # p" using Cons by simp - finally show ?case . + finally show ?case . qed lemma coeff_nth: "i < length p \ (coeff p) i = p ! (length p - 1 - i)" @@ -228,7 +228,7 @@ assume "p1 \ [] \ p2 \ []" hence "length p1 = length p2" using deg_eq unfolding degree_def - by (simp add: Nitpick.size_list_simp(2)) + by (simp add: Nitpick.size_list_simp(2)) thus ?thesis using coeff_iff_length_cond[of p1 p2] coeff_eq by simp next @@ -681,7 +681,7 @@ proof - let ?len = length and ?norm = normalize obtain a p' where p: "p = a # p'" - using assms(2) list.exhaust_sel by blast + using assms(2) list.exhaust_sel by blast hence a: "a \ carrier R - { \ }" and p': "set p' \ carrier R" using assms(1) unfolding p by (auto simp add: polynomial_def) hence "dense_repr p = (lead_coeff p, degree p) # dense_repr p'" @@ -742,7 +742,7 @@ next case (Cons a p1) let ?a_p2 = "(map (\b. a \ b) p2) @ (replicate (degree (a # p1)) \)" - + have "set (poly_mult p1 p2) \ carrier R" using Cons unfolding polynomial_def by auto @@ -775,7 +775,7 @@ lemma poly_mult_coeff: assumes "set p1 \ carrier R" "set p2 \ carrier R" shows "coeff (poly_mult p1 p2) = (\i. \ k \ {..i}. (coeff p1) k \ (coeff p2) (i - k))" - using assms(1) + using assms(1) proof (induction p1) case Nil thus ?case using assms(2) by auto next @@ -823,7 +823,7 @@ have "\k. k \ {..i} \ ?f2 k \\<^bsub>R\<^esub> ?f3 (i - k) = (if length p1 = k then a \ coeff p2 (i - k) else \)" using in_carrier by auto - hence "(\ k \ {..i}. ?f2 k \ ?f3 (i - k)) = + hence "(\ k \ {..i}. ?f2 k \ ?f3 (i - k)) = (\ k \ {..i}. (if length p1 = k then a \ coeff p2 (i - k) else \))" using in_carrier add.finprod_cong'[of "{..i}" "{..i}" "\k. ?f2 k \ ?f3 (i - k)" @@ -848,7 +848,7 @@ using in_carrier(1) assms(2) by auto moreover have "set (poly_mult p1 p2) \ carrier R" - using poly_mult_is_polynomial[of p1 p2] polynomial_in_carrier assms(2) Cons(2) by auto + using poly_mult_is_polynomial[of p1 p2] polynomial_in_carrier assms(2) Cons(2) by auto ultimately have "coeff (poly_mult (a # p1) p2) = (\i. ((coeff ?a_p2) i) \ ((coeff (poly_mult p1 p2)) i))" @@ -910,7 +910,7 @@ and "polynomial R (poly_add (poly_mult p1 p3) (poly_mult p2 p3))" using assms poly_add_is_polynomial poly_mult_is_polynomial polynomial_in_carrier by auto ultimately show ?thesis - using coeff_iff_polynomial_cond by auto + using coeff_iff_polynomial_cond by auto qed lemma poly_mult_l_distr: @@ -938,7 +938,7 @@ normalize_replicate_zero[of "length p2 + length p1" "[]"] by auto finally show ?thesis by auto qed } note aux_lemma = this - + from assms show ?thesis proof (induction n) case 0 thus ?case by simp @@ -988,7 +988,7 @@ using inj_on_def by force moreover have "(\k. i - k) ` {..i} \ {..i}" by auto hence "(\k. i - k) ` {..i} = {..i}" - using reindex_inj endo_inj_surj[of "{..i}" "\k. i - k"] by simp + using reindex_inj endo_inj_surj[of "{..i}" "\k. i - k"] by simp ultimately have "(\k \ {..i}. ?f k) = (\k \ {..i}. ?f (i - k))" using add.finprod_reindex[of ?f "\k. i - k" "{..i}"] in_carrier by auto @@ -1041,7 +1041,7 @@ using poly_add_normalize(1)[of "replicate (length p + n) \" "[]"] normalize_replicate_zero[of "length p + n" "[]"] by auto also have " ... = []" by simp - finally show ?case . + finally show ?case . qed thus "poly_mult p (replicate n \) = []" using poly_mult_comm[OF assms in_carrier] by simp @@ -1061,9 +1061,9 @@ next case (Cons b ps) hence "a \ lead_coeff p \ \" - using assms integral[of a "lead_coeff p"] unfolding polynomial_def by auto + using assms integral[of a "lead_coeff p"] unfolding polynomial_def by auto thus ?thesis - using Cons polynomial_in_carrier[OF assms(1)] assms(2) unfolding polynomial_def by auto + using Cons polynomial_in_carrier[OF assms(1)] assms(2) unfolding polynomial_def by auto qed ultimately show ?thesis using poly_add_zero(1)[of "map (\b. a \ b) p"] by simp @@ -1086,7 +1086,7 @@ hence "lead_coeff ((map (\b. a \ b) p) @ (replicate n \)) \ \" using Cons assms integral[of a b] unfolding polynomial_def by auto moreover have "set ((map (\b. a \ b) p) @ (replicate n \)) \ carrier R" - using polynomial_in_carrier[OF assms(1)] assms(2) DiffD1 by auto + using polynomial_in_carrier[OF assms(1)] assms(2) DiffD1 by auto ultimately have is_polynomial: "polynomial R ((map (\b. a \ b) p) @ (replicate n \))" using Cons unfolding polynomial_def by auto @@ -1107,7 +1107,7 @@ shows "poly_mult [ \ ] p = p" and "poly_mult p [ \ ] = p" proof - have "map (\a. \ \ a) p = p" - using polynomial_in_carrier[OF assms] by (meson assms l_one map_idI subsetCE) + using polynomial_in_carrier[OF assms] by (meson assms l_one map_idI subsetCE) thus "poly_mult [ \ ] p = p" and "poly_mult p [ \ ] = p" using poly_mult_const[OF assms, of \] by auto qed @@ -1119,7 +1119,7 @@ have p1: "lead_coeff p1 \ carrier R - { \ }" and p2: "lead_coeff p2 \ carrier R - { \ }" using assms unfolding polynomial_def by auto - have "(coeff (poly_mult p1 p2)) (degree p1 + degree p2) = + have "(coeff (poly_mult p1 p2)) (degree p1 + degree p2) = (\ k \ {..((degree p1) + (degree p2))}. (coeff p1) k \ (coeff p2) ((degree p1) + (degree p2) - k))" using poly_mult_coeff assms(1-2) polynomial_in_carrier by auto @@ -1299,7 +1299,7 @@ also have " ... = (\i \ {..n - ?len}. (a \ ?c2 i) \ ?c3 (n - (i + ?len)))" unfolding h_def by simp also have " ... = (\i \ {..n - ?len}. a \ (?c2 i \ ?c3 (n - (i + ?len))))" - using in_carrier assms(3) by (simp add: m_assoc) + using in_carrier assms(3) by (simp add: m_assoc) also have " ... = a \ (\i \ {..n - ?len}. ?c2 i \ ?c3 (n - (i + ?len)))" using finsum_rdistr[of "{..n - ?len}" a "\i. ?c2 i \ ?c3 (n - (i + ?len))"] in_carrier(2-3) assms(3) by simp @@ -1427,10 +1427,10 @@ proof (auto) fix p assume p: "polynomial R p" have "polynomial R [ \ \ ]" - unfolding polynomial_def using r_neg by fastforce + unfolding polynomial_def using r_neg by fastforce hence cond0: "polynomial R (poly_mult [ \ \ ] p)" using poly_mult_closed[of "[ \ \ ]" p] p by simp - + have "poly_add p (poly_mult [ \ \ ] p) = poly_add (poly_mult [ \ ] p) (poly_mult [ \ \ ] p)" using poly_mult_one[OF p] by simp also have " ... = poly_mult (poly_add [ \ ] [ \ \ ]) p" @@ -1498,6 +1498,51 @@ (auto simp add: univ_poly_def domain.poly_mult_integral[OF assms]) qed +lemma (in domain) univ_poly_a_inv_def': + assumes "p \ carrier (univ_poly R)" + shows "\\<^bsub>(univ_poly R)\<^esub> p = map (\a. \ a) p" +proof - + have aux_lemma: + "\p. p \ carrier (univ_poly R) \ p \\<^bsub>(univ_poly R)\<^esub> (map (\a. \ a) p) = []" + "\p. p \ carrier (univ_poly R) \ (map (\a. \ a) p) \ carrier (univ_poly R)" + proof - + fix p assume p: "p \ carrier (univ_poly R)" + hence set_p: "set p \ carrier R" + unfolding univ_poly_def polynomial_def by auto + show "(map (\a. \ a) p) \ carrier (univ_poly R)" + proof (cases "p = []") + assume "p = []" thus ?thesis + unfolding univ_poly_def polynomial_def by auto + next + assume not_nil: "p \ []" + hence "lead_coeff p \ \" + using p unfolding univ_poly_def polynomial_def by auto + moreover have "lead_coeff (map (\a. \ a) p) = \ (lead_coeff p)" + using not_nil by (simp add: hd_map) + ultimately have "lead_coeff (map (\a. \ a) p) \ \" + using hd_in_set local.minus_zero not_nil set_p by force + moreover have "set (map (\a. \ a) p) \ carrier R" + using set_p by (induct p) (auto) + ultimately show ?thesis + unfolding univ_poly_def polynomial_def by auto + qed + + have "map2 (\) p (map (\a. \ a) p) = replicate (length p) \" + using set_p by (induct p) (auto simp add: r_neg) + thus "p \\<^bsub>(univ_poly R)\<^esub> (map (\a. \ a) p) = []" + unfolding univ_poly_def using normalize_replicate_zero[of "length p" "[]"] by auto + qed + + interpret UP: ring "univ_poly R" + using univ_poly_is_ring[OF domain_axioms] . + + from aux_lemma + have "\p. p \ carrier (univ_poly R) \ \\<^bsub>(univ_poly R)\<^esub> p = map (\a. \ a) p" + by (metis Nil_is_map_conv UP.add.inv_closed UP.l_zero UP.r_neg1 UP.r_zero UP.zero_closed) + thus ?thesis + using assms by simp +qed + subsection \Long Division Theorem\ @@ -1519,7 +1564,7 @@ proof (cases "length b > length p") assume "length b > length p" hence "p = [] \ degree p < degree b" unfolding degree_def - by (meson diff_less_mono length_0_conv less_one not_le) + by (meson diff_less_mono length_0_conv less_one not_le) hence "?long_division p [] p" using poly_add_zero[OF less(2)] less(2) zero_is_polynomial poly_mult_zero[OF less(3)] by simp @@ -1546,7 +1591,7 @@ hence s_coeff: "lead_coeff s = (\ a)" using poly_mult_lead_coeff[OF monon_is_polynomial[OF in_carrier] less(3)] a c unfolding monon_def s_def b using m_assoc by force - + have "degree s = degree (monon ((\ a) \ inv c) (?len p - ?len b)) + degree b" using poly_mult_degree_eq[OF monon_is_polynomial[OF in_carrier] less(3)] unfolding s_def b monon_def by auto @@ -1560,7 +1605,7 @@ by (simp add: Nitpick.size_list_simp(2) local.Cons) obtain s' where s: "s = (\ a) # s'" - using s_coeff len_eq by (metis \s \ []\ hd_Cons_tl) + using s_coeff len_eq by (metis \s \ []\ hd_Cons_tl) define p_diff where "p_diff = poly_add p s" hence "?len p_diff < ?len p" @@ -1578,7 +1623,7 @@ using s_def monon_is_polynomial[OF in_carrier(1)] by auto have in_univ_carrier: "p \ carrier (univ_poly R)" "m \ carrier (univ_poly R)" "b \ carrier (univ_poly R)" - "r' \ carrier (univ_poly R)" "q' \ carrier (univ_poly R)" + "r' \ carrier (univ_poly R)" "q' \ carrier (univ_poly R)" using r' q' less(2-3) m(1) unfolding univ_poly_def by auto hence "poly_add p (poly_mult m b) = poly_add (poly_mult b q') r'" @@ -1589,7 +1634,7 @@ "(p \\<^bsub>(univ_poly R)\<^esub> (m \\<^bsub>(univ_poly R)\<^esub> b)) \\<^bsub>(univ_poly R)\<^esub> (m \\<^bsub>(univ_poly R)\<^esub> b) = ((b \\<^bsub>(univ_poly R)\<^esub>q') \\<^bsub>(univ_poly R)\<^esub> r') \\<^bsub>(univ_poly R)\<^esub> (m \\<^bsub>(univ_poly R)\<^esub> b)" by simp - hence "p = (b \\<^bsub>(univ_poly R)\<^esub> (q' \\<^bsub>(univ_poly R)\<^esub> m)) \\<^bsub>(univ_poly R)\<^esub> r'" + hence "p = (b \\<^bsub>(univ_poly R)\<^esub> (q' \\<^bsub>(univ_poly R)\<^esub> m)) \\<^bsub>(univ_poly R)\<^esub> r'" using in_univ_carrier by algebra hence "p = poly_add (poly_mult b (q' \\<^bsub>(univ_poly R)\<^esub> m)) r'" unfolding univ_poly_def by simp @@ -1611,7 +1656,7 @@ using long_division_theorem[OF assms] assms lead_coeff_not_zero[of "hd b" "tl b"] by (simp add: field_Units) -lemma univ_poly_is_euclidean_domain: +theorem univ_poly_is_euclidean: assumes "field R" shows "euclidean_domain (univ_poly R) degree" proof - @@ -1623,6 +1668,16 @@ using field.field_long_division_theorem[OF assms] by auto qed +corollary univ_poly_is_principal: + assumes "field R" + shows "principal_domain (univ_poly R)" +proof - + interpret UP: euclidean_domain "univ_poly R" degree + using univ_poly_is_euclidean[OF assms] . + show ?thesis + using UP.principal_domain_axioms . +qed + subsection \Consistency Rules\ @@ -1652,7 +1707,7 @@ qed lemma (in ring) poly_add_consistent [simp]: - assumes "subring K R" shows "ring.poly_add (R \ carrier := K \) = poly_add" + assumes "subring K R" shows "ring.poly_add (R \ carrier := K \) = poly_add" proof - have "\p q. ring.poly_add (R \ carrier := K \) p q = poly_add p q" proof - @@ -1666,7 +1721,7 @@ assumes "subring K R" shows "ring.poly_mult (R \ carrier := K \) = poly_mult" proof - have "\p q. ring.poly_mult (R \ carrier := K \) p q = poly_mult p q" - proof - + proof - fix p q show "ring.poly_mult (R \ carrier := K \) p q = poly_mult p q" using ring.poly_mult.simps[OF subring_is_ring[OF assms]] poly_add_consistent[OF assms] by (induct p) (auto) @@ -1674,7 +1729,7 @@ thus ?thesis by auto qed -lemma (in ring) univ_poly_carrier_change_def': +lemma (in ring) univ_poly_subring_def': assumes "subring K R" shows "univ_poly (R \ carrier := K \) = (univ_poly R) \ carrier := { p. polynomial R p \ set p \ K } \" unfolding univ_poly_def polynomial_def @@ -1683,6 +1738,26 @@ subringE(1)[OF assms] by auto +lemma (in domain) univ_poly_subring_is_domain: + assumes "subring K R" + shows "domain (univ_poly (R \ carrier := K \))" +proof - + have "domain (R \ carrier := K \)" + using subdomainI'[OF assms] unfolding subdomain_iff[OF subringE(1)[OF assms]] . + thus ?thesis + using univ_poly_is_domain[of "R \ carrier := K \"] by simp +qed + +lemma (in domain) univ_poly_subfield_is_euclidean: + assumes "subfield K R" + shows "euclidean_domain (univ_poly (R \ carrier := K \)) degree" + using univ_poly_is_euclidean[OF subfield_iff(2)[OF assms]] . + +lemma (in domain) univ_poly_subfield_is_principal: + assumes "subfield K R" + shows "principal_domain (univ_poly (R \ carrier := K \))" + using univ_poly_is_principal[OF subfield_iff(2)[OF assms]] . + subsection \The Evaluation Homomorphism\ @@ -1811,7 +1886,7 @@ hence "set (map ((\) b) q) \ carrier R" and "set (replicate n \) \ carrier R" using assms(2) by (induct q) (auto) hence "eval ((map ((\) b) q) @ (replicate n \)) a = (eval ((map ((\) b) q)) a) \ (a [^] n) \ \" - using eval_append[OF _ _ assms(3), of "map ((\) b) q" "replicate n \"] + using eval_append[OF _ _ assms(3), of "map ((\) b) q" "replicate n \"] eval_replicate[OF _ assms(3), of "[]"] by auto moreover have "eval (map ((\) b) q) a = b \ eval q a" using assms(2-3) eval_in_carrier b by(induct q) (auto simp add: degree_def m_assoc r_distr) @@ -1845,11 +1920,309 @@ proposition (in cring) eval_is_hom: assumes "subring K R" and "a \ carrier R" shows "(\p. (eval p) a) \ ring_hom (univ_poly (R \ carrier := K \)) R" - unfolding univ_poly_carrier_change_def'[OF assms(1)] + unfolding univ_poly_subring_def'[OF assms(1)] using polynomial_in_carrier eval_in_carrier eval_poly_add eval_poly_mult assms(2) by (auto intro!: ring_hom_memI simp add: univ_poly_def degree_def simp del: poly_add.simps poly_mult.simps) +theorem (in domain) eval_cring_hom: + assumes "subring K R" and "a \ carrier R" + shows "ring_hom_cring (univ_poly (R \ carrier := K \)) R (\p. (eval p) a)" + unfolding ring_hom_cring_def ring_hom_cring_axioms_def + using domain.axioms(1)[OF univ_poly_subring_is_domain[OF assms(1)]] + eval_is_hom[OF assms] cring_axioms by auto -end \ No newline at end of file +corollary (in domain) eval_ring_hom: + assumes "subring K R" and "a \ carrier R" + shows "ring_hom_ring (univ_poly (R \ carrier := K \)) R (\p. (eval p) a)" + using eval_cring_hom[OF assms] ring_hom_ringI2 + unfolding ring_hom_cring_def ring_hom_cring_axioms_def cring_def by auto + + +subsection \The Reduction Map and Uniqueness of The Evaluation Homomorphism\ + +definition (in ring) reduction_map :: "('c \ 'a) \ 'c list \ 'a list" + where "reduction_map h = (\p. normalize (map h p))" + +(* +lemma (in ring_hom_ring) + "(reduction_map h) \ ring_hom (univ_poly R) (univ_poly S)" + sorry +*) + + +subsection \Divisibility of Polynomials\ + +definition pirreducible :: "_ \ 'a list \ bool" + where "pirreducible R p \ irreducible (mult_of (univ_poly R)) p" + +definition pprime :: "_ \ 'a list \ bool" + where "pprime R p \ prime (mult_of (univ_poly R)) p" + +definition rupture :: "_ \ 'a list \ _" + where "rupture R p = (univ_poly R) Quot (PIdl\<^bsub>(univ_poly R)\<^esub> p)" + + +text \Be aware of Nil!\ +lemma (in domain) Nil_is_pirreducible: "pirreducible R []" + unfolding pirreducible_def using poly_mult_integral + by (auto intro!: irreducibleI simp add: Units_def univ_poly_def properfactor_def factor_def, force) + +lemma (in field) pprime_iff_ppirreducible: + assumes "polynomial R p" and "p \ []" + shows "pprime R p \ pirreducible R p" +proof - + have "p \ carrier (mult_of (univ_poly R))" + using assms unfolding univ_poly_def by auto + thus ?thesis + using principal_domain.primeness_condition[OF univ_poly_is_principal[OF field_axioms]] + unfolding pprime_def pirreducible_def by simp +qed + +lemma (in field) rupture_field: + assumes "polynomial R p" and "p \ []" + shows "field (rupture R p) \ pirreducible R p" +proof - + have "p \ carrier (mult_of (univ_poly R))" + using assms(1-2) unfolding univ_poly_def by auto + thus ?thesis + using principal_domain.field_iff_prime[OF univ_poly_is_principal[OF field_axioms]] + pprime_iff_ppirreducible[OF assms] + unfolding pprime_def rupture_def by simp +qed + +lemma (in field) univ_poly_units: + "Units (univ_poly R) = { [ k ] | k. k \ carrier R - { \ } }" +proof + show "Units (univ_poly R) \ { [ k ] | k. k \ carrier R - { \ } }" + proof + fix p assume "p \ Units (univ_poly R)" + then obtain q where p: "polynomial R p" and q: "polynomial R q" and pq: "poly_mult p q = [ \ ]" + unfolding Units_def univ_poly_def by auto + hence not_nil: "p \ []" and "q \ []" + using poly_mult_integral[OF p q] poly_mult_zero[OF p] by auto + hence "degree p = 0" + using poly_mult_degree_eq[OF p q] unfolding pq degree_def by simp + hence "length p = 1" + using not_nil unfolding degree_def by (metis One_nat_def Suc_pred length_greater_0_conv) + then obtain k where k: "p = [ k ]" + by (metis One_nat_def length_0_conv length_Suc_conv) + hence "k \ carrier R - { \ }" + using p unfolding polynomial_def by auto + thus "p \ { [ k ] | k. k \ carrier R - { \ } }" + unfolding k by blast + qed +next + show "{ [ k ] | k. k \ carrier R - { \ } } \ Units (univ_poly R)" + proof (auto) + fix k assume k: "k \ carrier R" "k \ \" + hence inv_k: "inv k \ carrier R" "inv k \ \" and "k \ inv k = \" "inv k \ k = \" + using subfield_m_inv[OF carrier_is_subfield, of k] by auto + hence "poly_mult [ k ] [ inv k ] = [ \ ]" and "poly_mult [ inv k ] [ k ] = [ \ ]" + by (auto simp add: degree_def k) + moreover have "polynomial R [ k ]" and "polynomial R [ inv k ]" + using const_is_polynomial k inv_k by auto + ultimately show "[ k ] \ Units (univ_poly R)" + unfolding Units_def univ_poly_def by (auto simp del: poly_mult.simps) + qed +qed + +corollary (in field) univ_poly_not_field: "\ field (univ_poly R)" +proof - + have "[ \, \ ] \ carrier (univ_poly R) - { \\<^bsub>(univ_poly R)\<^esub> }" + and "[ \, \ ] \ { [ k ] | k. k \ carrier R - { \ } }" + unfolding univ_poly_def polynomial_def by auto + thus ?thesis + using field.field_Units[of "univ_poly R"] + unfolding univ_poly_units by blast +qed + +text \A stronger version for one sense of rupture_field lemma.\ +corollary (in field) rupture_field_imp_pirreducible: + assumes "polynomial R p" and "field (rupture R p)" + shows "p \ []" and "pirreducible R p" +proof - + interpret UP: domain "univ_poly R" + using univ_poly_is_domain[OF domain_axioms] . + + show "p \ []" + proof (rule ccontr) + assume "\ p \ []" + hence nil: "p = []" "p = \\<^bsub>(univ_poly R)\<^esub>" + unfolding univ_poly_def by simp+ + hence "rupture R p = (univ_poly R) Quot { \\<^bsub>(univ_poly R)\<^esub> }" + unfolding rupture_def + using UP.genideal_zero UP.cgenideal_eq_genideal[OF UP.zero_closed] by simp + hence "rupture R p \ univ_poly R" + using UP.FactRing_zeroideal(1) by simp + then obtain h where h: "h \ ring_iso (rupture R p) (univ_poly R)" + unfolding is_ring_iso_def by blast + moreover have "ring (rupture R p)" + using assms(2) by (simp add: cring_def domain_def field_def) + ultimately interpret ring_hom_ring "rupture R p" "univ_poly R" h + unfolding ring_hom_ring_def ring_hom_ring_axioms_def ring_iso_def + using UP.is_ring by simp + have "field (univ_poly R)" + using field.ring_iso_imp_img_field[OF assms(2) h] by simp + thus False + using univ_poly_not_field by simp + qed + thus "pirreducible R p" + using rupture_field assms by simp +qed + +lemma (in field) associated_polynomials_iff: + assumes "polynomial R p" and "polynomial R q" + shows "p \\<^bsub>(univ_poly R)\<^esub> q \ (\k \ carrier R - { \ }. p = map (\a. k \ a) q)" +proof + interpret UP: principal_domain "univ_poly R" + using univ_poly_is_principal[OF field_axioms] . + + assume A: "p \\<^bsub>(univ_poly R)\<^esub> q" + then obtain r1 r2 + where r1: "polynomial R r1" "p = poly_mult q r1" + and r2: "polynomial R r2" "q = poly_mult p r2" + unfolding associated_def factor_def univ_poly_def by auto + + show "\k \ carrier R - { \ }. p = map (\a. k \ a) q" + proof (cases "p = []") + assume "p = []" thus ?thesis + using poly_mult_zero[OF r2(1)] r2(2) by auto + next + assume p: "p \ []" hence q: "q \ []" + using poly_mult_zero[OF r1(1)] r1(2) by auto + hence "p \ carrier (mult_of (univ_poly R))" and "q \ carrier (mult_of (univ_poly R))" + using p assms unfolding univ_poly_def by auto + moreover have "p \\<^bsub>mult_of (univ_poly R)\<^esub> q" + using p UP.assoc_imp_assoc_mult[OF _ _ A] assms unfolding univ_poly_def by auto + ultimately obtain r where r: "r \ Units (univ_poly R)" "p = q \\<^bsub>(univ_poly R)\<^esub> r" + using UP.mult_of.associatedD2[of p q] UP.Units_mult_eq_Units by blast + then obtain k where k: "k \ carrier R - { \ }" "r = [ k ]" + using univ_poly_units UP.m_comm[of q r] by auto + moreover have "p = poly_mult r q" + using r UP.m_comm[of q r] q assms unfolding Units_def univ_poly_def by auto + ultimately show ?thesis + using poly_mult_const(1)[OF assms(2) k(1)] unfolding k(2) by auto + qed +next + assume "\k \ carrier R - { \ }. p = map (\a. k \ a) q" + then obtain k where k: "k \ carrier R - { \ }" "p = map (\a. k \ a) q" + by blast + hence inv_k: "inv k \ carrier R - { \ }" "inv k \ k = \" + using subfield_m_inv[OF carrier_is_subfield k(1)] by simp+ + moreover have "map (\a. inv k \ a) (map (\a. k \ a) q) = q" + using inv_k polynomial_in_carrier[OF assms(2)] k(1) m_assoc m_comm by (induct q) (auto) + hence "q = map (\a. inv k \ a) p" + using k(2) by simp + ultimately have "p = poly_mult q [ k ]" and "q = poly_mult p [ inv k ]" + using poly_mult_const(2)[OF assms(2) k(1)] + poly_mult_const(2)[OF assms(1) inv_k(1)] k(2) by auto + moreover have "polynomial R [ k ]" and "polynomial R [ inv k ]" + using const_is_polynomial k inv_k by auto + ultimately show "p \\<^bsub>(univ_poly R)\<^esub> q" + unfolding univ_poly_def associated_def factor_def + by (auto simp del: poly_mult.simps) +qed + +lemma (in cring) ideal_eq_carrier_iff: (* <- Move to Ideal.thy *) + assumes "a \ carrier R" + shows "carrier R = PIdl a \ a \ Units R" +proof + assume "carrier R = PIdl a" + hence "\ \ PIdl a" + by auto + then obtain b where "b \ carrier R" "\ = a \ b" "\ = b \ a" + unfolding cgenideal_def using m_comm[OF assms] by auto + thus "a \ Units R" + using assms unfolding Units_def by auto +next + assume "a \ Units R" + then have inv_a: "inv a \ carrier R" "inv a \ a = \" + by auto + have "carrier R \ PIdl a" + proof + fix b assume "b \ carrier R" + hence "(b \ inv a) \ a = b" and "b \ inv a \ carrier R" + using m_assoc[OF _ inv_a(1) assms] inv_a by auto + thus "b \ PIdl a" + unfolding cgenideal_def by force + qed + thus "carrier R = PIdl a" + using assms by (simp add: cgenideal_eq_rcos r_coset_subset_G subset_antisym) +qed + +text \We don't suppose that x is algebraic, because, in our definition, [] is pirreducible.\ +lemma (in field) exists_ker_generator_pirreducible: + assumes "x \ carrier R - { \ }" + shows "\p. polynomial R p \ + pirreducible R p \ + a_kernel (univ_poly R) R (\p. eval p x) = PIdl\<^bsub>(univ_poly R)\<^esub> p" + (is "\p. polynomial R p \ ?pirr R p \ ?a_ker p = ?PIdl p") +proof - + interpret UP: principal_domain "univ_poly R" + using univ_poly_is_principal[OF field_axioms] by simp + + have ker: "ideal (a_kernel (univ_poly R) R (\p. eval p x)) (univ_poly R)" + using ring_hom_ring.kernel_is_ideal[OF eval_ring_hom[OF carrier_is_subring]] assms by simp + obtain p where in_carrier: "p \ carrier (univ_poly R)" and p: "?a_ker p = ?PIdl p" + using principalideal.generate[OF UP.principal_I[OF ker]] UP.cgenideal_eq_genideal by auto + hence poly: "polynomial R p" + unfolding univ_poly_def by simp + + show ?thesis + proof (cases "p = []") + assume "p = []" thus ?thesis + using poly Nil_is_pirreducible p by auto + next + assume not_Nil: "p \ []" + + have "eval (monon \ (Suc 0)) x = x" + using assms eval_monon[of \ x "Suc 0"] by auto + moreover have "monon \ (Suc 0) \ carrier (univ_poly R)" + using monon_is_polynomial unfolding univ_poly_def by auto + ultimately have "?a_ker p \ carrier (univ_poly R)" + unfolding a_kernel_def' using assms by force + hence not_unit: "p \ Units (mult_of (univ_poly R))" + using p UP.ideal_eq_carrier_iff by auto + + have "pprime R p" + unfolding pprime_def + proof (rule primeI[OF not_unit]) + fix a b + assume "a \ carrier (mult_of (univ_poly R))" + and "b \ carrier (mult_of (univ_poly R))" + and "p divides\<^bsub>mult_of (univ_poly R)\<^esub> (a \\<^bsub>mult_of (univ_poly R)\<^esub> b)" + then obtain c + where a: "polynomial R a" "a \ []" and b: "polynomial R b" "b \ []" and c: "polynomial R c" "c \ []" + and dvd: "poly_mult a b = poly_mult p c" + unfolding univ_poly_def factor_def by auto + hence "(eval a x) \ (eval b x) = (eval p x) \ (eval c x)" + using eval_poly_mult[of a b x] eval_poly_mult[of p c x] poly + polynomial_in_carrier assms by auto + moreover have "eval p x = \" + using p UP.cgenideal_self[OF in_carrier] unfolding a_kernel_def' by auto + ultimately have "(eval a x) \ (eval b x) = \" + using eval_in_carrier[OF polynomial_in_carrier[OF c(1)]] assms by auto + hence "(eval a x) = \ \ (eval b x) = \" + using integral eval_in_carrier polynomial_in_carrier a b assms by auto + moreover + have "\a. \ polynomial R a; a \ []; (eval a x) = \ \ \ p divides\<^bsub>mult_of (univ_poly R)\<^esub> a" + proof - + fix a assume a: "polynomial R a" "a \ []" "(eval a x) = \" + hence "a \ ?PIdl p" + using p unfolding a_kernel_def' univ_poly_def by auto + hence "p divides\<^bsub>(univ_poly R)\<^esub> a" + using UP.m_comm[OF in_carrier] unfolding cgenideal_def factor_def by auto + thus "p divides\<^bsub>mult_of (univ_poly R)\<^esub> a" + using UP.divides_imp_divides_mult[OF in_carrier] a unfolding univ_poly_def by auto + qed + ultimately show "p divides\<^bsub>mult_of (univ_poly R)\<^esub> a \ p divides\<^bsub>mult_of (univ_poly R)\<^esub> b" + using a b by blast + qed + thus ?thesis + using poly p unfolding pprime_iff_ppirreducible[OF poly not_Nil] by auto + qed +qed + +end diff -r a3723b11bd60 -r 654e73d05495 src/HOL/Algebra/QuotRing.thy --- a/src/HOL/Algebra/QuotRing.thy Tue Jul 03 00:15:16 2018 +0100 +++ b/src/HOL/Algebra/QuotRing.thy Tue Jul 03 10:07:24 2018 +0100 @@ -1022,6 +1022,18 @@ shows "R Quot (a_kernel R S h) \ S" using FactRing_iso_set assms is_ring_iso_def by auto +corollary (in ring) FactRing_zeroideal: + shows "R Quot { \ } \ R" and "R \ R Quot { \ }" +proof - + have "ring_hom_ring R R id" + using ring_axioms by (auto intro: ring_hom_ringI) + moreover have "a_kernel R R id = { \ }" + unfolding a_kernel_def' by auto + ultimately show "R Quot { \ } \ R" and "R \ R Quot { \ }" + using ring_hom_ring.FactRing_iso[of R R id] + ring_iso_sym[OF ideal.quotient_is_ring[OF zeroideal], of R] by auto +qed + lemma (in ring_hom_ring) img_is_ring: "ring (S \ carrier := h ` (carrier R) \)" proof - let ?the_elem = "\X. the_elem (h ` X)" diff -r a3723b11bd60 -r 654e73d05495 src/HOL/Algebra/Ring_Divisibility.thy --- a/src/HOL/Algebra/Ring_Divisibility.thy Tue Jul 03 00:15:16 2018 +0100 +++ b/src/HOL/Algebra/Ring_Divisibility.thy Tue Jul 03 10:07:24 2018 +0100 @@ -4,30 +4,10 @@ (* ************************************************************************** *) theory Ring_Divisibility -imports Ideal Divisibility QuotRing +imports Ideal Divisibility QuotRing Multiplicative_Group begin -section \Definitions ported from @{text "Multiplicative_Group.thy"}\ - -definition mult_of :: "('a, 'b) ring_scheme \ 'a monoid" where - "mult_of R \ \ carrier = carrier R - { \\<^bsub>R\<^esub> }, mult = mult R, one = \\<^bsub>R\<^esub> \" - -lemma carrier_mult_of [simp]: "carrier (mult_of R) = carrier R - { \\<^bsub>R\<^esub> }" - by (simp add: mult_of_def) - -lemma mult_mult_of [simp]: "mult (mult_of R) = mult R" - by (simp add: mult_of_def) - -lemma nat_pow_mult_of: "([^]\<^bsub>mult_of R\<^esub>) = (([^]\<^bsub>R\<^esub>) :: _ \ nat \ _)" - by (simp add: mult_of_def fun_eq_iff nat_pow_def) - -lemma one_mult_of [simp]: "\\<^bsub>mult_of R\<^esub> = \\<^bsub>R\<^esub>" - by (simp add: mult_of_def) - -lemmas mult_of_simps = carrier_mult_of mult_mult_of nat_pow_mult_of one_mult_of - - section \The Arithmetic of Rings\ text \In this section we study the links between the divisibility theory and that of rings\ @@ -127,14 +107,14 @@ lemma (in cring) to_contain_is_to_divide: assumes "a \ carrier R" "b \ carrier R" shows "(PIdl b \ PIdl a) = (a divides b)" -proof +proof show "PIdl b \ PIdl a \ a divides b" proof - assume "PIdl b \ PIdl a" hence "b \ PIdl a" by (meson assms(2) local.ring_axioms ring.cgenideal_self subsetCE) thus ?thesis - unfolding factor_def cgenideal_def using m_comm assms(1) by blast + unfolding factor_def cgenideal_def using m_comm assms(1) by blast qed show "a divides b \ PIdl b \ PIdl a" proof - @@ -166,15 +146,23 @@ lemma (in domain) divides_imp_divides_mult [simp]: "\ a \ carrier R; b \ carrier R - { \ } \ \ a divides\<^bsub>R\<^esub> b \ a divides\<^bsub>(mult_of R)\<^esub> b" - unfolding factor_def using integral_iff by auto + unfolding factor_def using integral_iff by auto lemma assoc_mult_imp_assoc [simp]: "a \\<^bsub>(mult_of R)\<^esub> b \ a \\<^bsub>R\<^esub> b" unfolding associated_def by simp lemma (in domain) assoc_imp_assoc_mult [simp]: - "\ a \ carrier R - { \ } ; b \ carrier R - { \ } \ \ - a \\<^bsub>R\<^esub> b \ a \\<^bsub>(mult_of R)\<^esub> b" - unfolding associated_def by simp + assumes "a \ carrier R - { \ }" and "b \ carrier R" + shows "a \\<^bsub>R\<^esub> b \ a \\<^bsub>(mult_of R)\<^esub> b" +proof - + assume A: "a \\<^bsub>R\<^esub> b" + then obtain c where "c \ carrier R" "a = b \ c" + unfolding associated_def factor_def by auto + hence "b \ carrier R - { \ }" + using assms integral by auto + thus "a \\<^bsub>(mult_of R)\<^esub> b" + using A assms(1) unfolding associated_def by simp +qed lemma (in domain) Units_mult_eq_Units [simp]: "Units (mult_of R) = Units R" unfolding Units_def using insert_Diff integral_iff by auto @@ -198,7 +186,7 @@ using c A integral_iff by auto thus "properfactor R b a" using A divides_imp_divides_mult[of a b] unfolding properfactor_def - by (meson DiffI divides_mult_imp_divides empty_iff insert_iff) + by (meson DiffI divides_mult_imp_divides empty_iff insert_iff) qed lemma (in domain) properfactor_imp_properfactor_mult: @@ -269,7 +257,7 @@ qed qed moreover have "PIdl p \ carrier R" using A primeideal.I_notcarr by auto - ultimately show False by simp + ultimately show False by simp qed next { fix a assume "a \ PIdl p" and a: "a \ \" @@ -333,12 +321,12 @@ from \finite S\ and \S \ (\i. I i)\ have "\n. S \ I n" proof (induct S set: "finite") - case empty thus ?case by simp + case empty thus ?case by simp next case (insert x S') then obtain n m where m: "S' \ I m" and n: "x \ I n" by blast hence "insert x S' \ I (max m n)" - by (meson assms(2) insert_subsetI max.cobounded1 max.cobounded2 rev_subsetD subset_trans) + by (meson assms(2) insert_subsetI max.cobounded1 max.cobounded2 rev_subsetD subset_trans) thus ?case by blast qed then obtain n where "S \ I n" by blast @@ -427,7 +415,7 @@ using S_builder_incl[of R J] J S_def I_def by (meson additive_subgroup.a_subset dual_order.trans ideal.axioms(1) subset_Idl_subset) ultimately obtain n where "\k. k \ n \ I k = I n" - using assms increasing_set_seq_iff[of I] by (metis lift_Suc_mono_le) + using assms increasing_set_seq_iff[of I] by (metis lift_Suc_mono_le) hence "J = Idl (S_builder R J n)" using S_builder_const1[OF J, of n] S_builder_const2[OF J, of n] I_def S_def by (meson Suc_n_not_le_n le_cases) @@ -436,7 +424,7 @@ by (meson J S_builder_incl ideal.Icarr set_rev_mp subsetI) qed thus ?thesis - by (simp add: local.ring_axioms noetherian_ring_axioms_def noetherian_ring_def) + by (simp add: local.ring_axioms noetherian_ring_axioms_def noetherian_ring_def) qed lemma (in noetherian_domain) wfactors_exists: @@ -450,7 +438,7 @@ have "\ irreducible (mult_of R) x" proof (rule ccontr) assume "\ (\ irreducible (mult_of R) x)" hence "irreducible (mult_of R) x" by simp - hence "wfactors (mult_of R) [ x ] x" unfolding wfactors_def using A by auto + hence "wfactors (mult_of R) [ x ] x" unfolding wfactors_def using A by auto thus False using A by auto qed moreover have "\ x \ Units (mult_of R)" @@ -472,11 +460,11 @@ using fs_a fs_b a b mult_of.wfactors_mult by simp moreover have "set (fs_a @ fs_b) \ carrier (mult_of R)" using fs_a fs_b by auto - ultimately show False using A by blast + ultimately show False using A by blast qed thus ?thesis using a b b_properfactor mult_of.m_comm by blast qed } note aux_lemma = this - + assume A: "\ ?P x" define f :: "'a \ 'a \ bool" @@ -485,7 +473,7 @@ where "factor_seq = rec_nat x (\n y. (SOME a. f a y))" define I where "I = (\i. PIdl (factor_seq i))" have factor_seq_props: - "\n. properfactor (mult_of R) (factor_seq (Suc n)) (factor_seq n) \ + "\n. properfactor (mult_of R) (factor_seq (Suc n)) (factor_seq n) \ (factor_seq n) \ carrier (mult_of R) \ \ ?P (factor_seq n)" (is "\n. ?Q n") proof - fix n show "?Q n" @@ -519,7 +507,7 @@ qed have in_carrier: "\i. factor_seq i \ carrier R" - using factor_seq_props by simp + using factor_seq_props by simp hence "\i. ideal (I i) R" using I_def by (simp add: cgenideal_ideal) @@ -582,11 +570,12 @@ hence "q divides p" using to_contain_is_to_divide[of q p] using assms(1) J(1-2) by simp hence q_div_p: "q divides\<^bsub>(mult_of R)\<^esub> p" - using assms(1) divides_imp_divides_mult[OF q(1), of p] by (simp add: \q divides p\) + using assms(1) divides_imp_divides_mult[OF q(1), of p] by (simp add: \q divides p\) show "J = PIdl p \ J = carrier R" proof (cases "q \ Units R") case True thus ?thesis - by (metis J(1) Units_r_inv_ex cgenideal_self ideal.I_r_closed ideal.one_imp_carrier q(1) q(2)) + by (metis J(3) Unit_eq_dividesone cgenideal_eq_genideal genideal_one one_closed q + subset_antisym to_contain_is_to_divide) next case False have q_in_carr: "q \ carrier (mult_of R)" @@ -749,12 +738,12 @@ next fix I assume I: "ideal I R" show "principalideal I R" proof (cases "I = { \ }") - case True thus ?thesis by (simp add: zeropideal) + case True thus ?thesis by (simp add: zeropideal) next case False hence A: "I - { \ } \ {}" - using I additive_subgroup.zero_closed ideal.axioms(1) by auto + using I additive_subgroup.zero_closed ideal.axioms(1) by auto define phi_img :: "nat set" where "phi_img = (\ ` (I - { \ }))" - hence "phi_img \ {}" using A by simp + hence "phi_img \ {}" using A by simp then obtain m where "m \ phi_img" "\k. k \ phi_img \ m \ k" using exists_least_iff[of "\n. n \ phi_img"] not_less by force then obtain a where a: "a \ I - { \ }" "\b. b \ I - { \ } \ \ a \ \ b" @@ -773,7 +762,7 @@ unfolding cgenideal_def using m_comm[of a] ideal.Icarr[OF I] a(1) by auto hence 1: "\ r < \ a \ r \ \" using eucl_div(4) b(2) by auto - + have "r = (\ (a \ q)) \ b" using eucl_div(1-3) a(1) b(1) ideal.Icarr[OF I] r_neg1 by auto moreover have "\ (a \ q) \ I" @@ -803,4 +792,4 @@ by blast qed -end \ No newline at end of file +end