(* Title: HOL/Algebra/Ring_Divisibility.thy Author: Paulo Emílio de Vilhena
*)
theory Ring_Divisibility imports Ideal Divisibility QuotRing Multiplicative_Group
begin
(* TEMPORARY ====================================================================== *) 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)
locale principal_domain = domain + assumes exists_gen: "ideal I R \ \a \ carrier R. I = PIdl a"
locale euclidean_domain = domain R for R (structure) + fixes\<phi> :: "'a \<Rightarrow> nat" assumes euclidean_function: " \ a \ carrier R - { \ }; b \ carrier R - { \ } \ \ \<exists>q r. q \<in> carrier R \<and> r \<in> carrier R \<and> a = (b \<otimes> q) \<oplus> r \<and> ((r = \<zero>) \<or> (\<phi> r < \<phi> b))"
definition ring_irreducible :: "('a, 'b) ring_scheme \ 'a \ bool" (\ring'_irreducible\\) where"ring_irreducible\<^bsub>R\<^esub> a \ (a \ \\<^bsub>R\<^esub>) \ (irreducible R a)"
definition ring_prime :: "('a, 'b) ring_scheme \ 'a \ bool" (\ring'_prime\\) where"ring_prime\<^bsub>R\<^esub> a \ (a \ \\<^bsub>R\<^esub>) \ (prime R a)"
subsection \<open>The cancellative monoid of a domain. \<close>
sublocale domain < mult_of: comm_monoid_cancel "mult_of R"
rewrites "mult (mult_of R) = mult R" and"one (mult_of R) = one R" using m_comm m_assoc by (auto intro!: comm_monoid_cancelI comm_monoidI
simp add: m_rcancel integral_iff)
sublocale factorial_domain < mult_of: factorial_monoid "mult_of R"
rewrites "mult (mult_of R) = mult R" and"one (mult_of R) = one R" using factorial_monoid_axioms by auto
lemma (in ring) noetherian_ringI: assumes"\I. ideal I R \ \A \ carrier R. finite A \ I = Idl A" shows"noetherian_ring R" using assms by unfold_locales auto
lemma (indomain) euclidean_domainI: assumes"\a b. \ a \ carrier R - { \ }; b \ carrier R - { \ } \ \ \<exists>q r. q \<in> carrier R \<and> r \<in> carrier R \<and> a = (b \<otimes> q) \<oplus> r \<and> ((r = \<zero>) \<or> (\<phi> r < \<phi> b))" shows"euclidean_domain R \" using assms by unfold_locales auto
subsection \<open>Passing from \<^term>\<open>R\<close> to \<^term>\<open>mult_of R\<close> and vice-versa. \<close>
lemma divides_mult_imp_divides [simp]: "a divides\<^bsub>(mult_of R)\<^esub> b \ a divides\<^bsub>R\<^esub> b" unfolding factor_def by auto
lemma (indomain) 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
lemma (in cring) divides_one: assumes"a \ carrier R" shows"a divides \ \ a \ Units R" using assms m_comm unfolding factor_def Units_def by force
lemma (in ring) one_divides: assumes"a \ carrier R" shows "\ divides a" using assms unfolding factor_def by simp
lemma (in ring) divides_zero: assumes"a \ carrier R" shows "a divides \" using r_null[OF assms] unfolding factor_def by force
lemma (in ring) zero_divides: shows"\ divides a \ a = \" unfolding factor_def by auto
lemma (indomain) divides_mult_zero: assumes"a \ carrier R" shows "a divides\<^bsub>(mult_of R)\<^esub> \ \ a = \" using integral[OF _ assms] unfolding factor_def by auto
lemma (in ring) divides_mult: assumes"a \ carrier R" "c \ carrier R" shows"a divides b \ (c \ a) divides (c \ b)" using m_assoc[OF assms(2,1)] unfolding factor_def by auto
lemma (indomain) mult_divides: assumes"a \ carrier R" "b \ carrier R" "c \ carrier R - { \ }" shows"(c \ a) divides (c \ b) \ a divides b" using assms m_assoc[of c] unfolding factor_def by (simp add: m_lcancel)
lemma (indomain) assoc_iff_assoc_mult: assumes"a \ carrier R" and "b \ carrier R" shows"a \ b \ a \\<^bsub>(mult_of R)\<^esub> b" proof assume"a \\<^bsub>(mult_of R)\<^esub> b" thus "a \ b" unfolding associated_def factor_def by auto next assume A: "a \ b" thenobtain c1 c2 where c1: "c1 \ carrier R" "a = b \ c1" and c2: "c2 \ carrier R" "b = a \ c2" unfolding associated_def factor_def by auto show"a \\<^bsub>(mult_of R)\<^esub> b" proof (cases "a = \") assume a: "a = \" then have b: "b = \" using c2 by auto show ?thesis unfolding associated_def factor_def a b by auto next assume a: "a \ \" hence b: "b \ \" and c1_not_zero: "c1 \ \" using c1 assms by auto hence c2_not_zero: "c2 \ \" using c2 assms by auto show ?thesis unfolding associated_def factor_def using c1 c2 c1_not_zero c2_not_zero a b by auto qed qed
lemma (indomain) Units_mult_eq_Units [simp]: "Units (mult_of R) = Units R" unfolding Units_def using insert_Diff integral_iff by auto
lemma (indomain) ring_associated_iff: assumes"a \ carrier R" "b \ carrier R" shows"a \ b \ (\u \ Units R. a = u \ b)" proof (cases "a = \") assume [simp]: "a = \" show ?thesis proof assume"a \ b" thus "\u \ Units R. a = u \ b" using zero_divides unfolding associated_def by force next assume"\u \ Units R. a = u \ b" then have "b = \" by (metis Units_closed Units_l_cancel \<open>a = \<zero>\<close> assms r_null) thus"a \ b" using zero_divides[of \<zero>] by auto qed next assume a: "a \ \" show ?thesis proof (cases "b = \") assume"b = \" thus ?thesis using assms a zero_divides[of a] r_null unfolding associated_def by blast next assume b: "b \ \" have"(\u \ Units R. a = u \ b) \ (\u \ Units R. a = b \ u)" using m_comm[OF assms(2)] Units_closed by auto thus ?thesis using mult_of.associated_iff[of a b] a b assms unfolding assoc_iff_assoc_mult[OF assms] Units_mult_eq_Units by auto qed qed
lemma (indomain) properfactor_mult_imp_properfactor: "\ a \ carrier R; b \ carrier R \ \ properfactor (mult_of R) b a \ properfactor R b a" proof - assume A: "a \ carrier R" "b \ carrier R" "properfactor (mult_of R) b a" thenobtain c where c: "c \ carrier (mult_of R)" "a = b \ c" unfolding properfactor_def factor_def by auto have"a \ \" proof (rule ccontr) assume a: "\ a \ \" hence"b = \" using c A integral[of b c] by auto hence"b = a \ \" using a A by simp hence"a divides\<^bsub>(mult_of R)\<^esub> b" unfolding factor_def by auto thus False using A unfolding properfactor_def by simp qed hence"b \ \" 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) qed
lemma (indomain) properfactor_imp_properfactor_mult: "\ a \ carrier R - { \ }; b \ carrier R \ \ properfactor R b a \ properfactor (mult_of R) b a" unfolding properfactor_def factor_def by auto
lemma (indomain) properfactor_of_zero: assumes"b \ carrier R" shows"\ properfactor (mult_of R) b \" and "properfactor R b \ \ b \ \" using divides_mult_zero[OF assms] divides_zero[OF assms] unfolding properfactor_def by auto
subsection \<open>Irreducible\<close>
text\<open>The following lemmas justify the need for a definition of irreducible specific to rings: for\<^term>\<open>irreducible R\<close>, we need to suppose we are not in a field (which is plausible,
but \<^term>\<open>\<not> field R\<close> is an assumption we want to avoid; for \<^term>\<open>irreducible (mult_of R)\<close>, zero is allowed. \<close>
lemma (indomain) zero_is_irreducible_mult: shows"irreducible (mult_of R) \" unfolding irreducible_def Units_def properfactor_def factor_def using integral_iff by fastforce
lemma (indomain) zero_is_irreducible_iff_field: shows"irreducible R \ \ field R" proof assume irr: "irreducible R \" have"\a. \ a \ carrier R; a \ \ \ \ properfactor R a \" unfolding properfactor_def factor_def by (auto, metis r_null zero_closed) hence"carrier R - { \ } = Units R" using irr unfolding irreducible_def by auto thus"field R" using field.intro[OF domain_axioms] unfolding field_axioms_def by simp next assume field: "field R"show"irreducible R \" using field.field_Units[OF field] unfolding irreducible_def properfactor_def factor_def by blast qed
lemma (indomain) irreducible_imp_irreducible_mult: "\ a \ carrier R; irreducible R a \ \ irreducible (mult_of R) a" using zero_is_irreducible_mult Units_mult_eq_Units properfactor_mult_imp_properfactor by (cases "a = \") (auto simp add: irreducible_def)
lemma (indomain) irreducible_mult_imp_irreducible: "\ a \ carrier R - { \ }; irreducible (mult_of R) a \ \ irreducible R a" unfolding irreducible_def using properfactor_imp_properfactor_mult properfactor_divides by fastforce
lemma (indomain) ring_irreducibleE: assumes"r \ carrier R" and "ring_irreducible r" shows"r \ \" "irreducible R r" "irreducible (mult_of R) r" "r \ Units R" and"\a b. \ a \ carrier R; b \ carrier R \ \ r = a \ b \ a \ Units R \ b \ Units R" proof - show"irreducible (mult_of R) r""irreducible R r" using assms irreducible_imp_irreducible_mult unfolding ring_irreducible_def by auto show"r \ \" "r \ Units R" using assms unfolding ring_irreducible_def irreducible_def by auto next fix a b assume a: "a \ carrier R" and b: "b \ carrier R" and r: "r = a \ b" show"a \ Units R \ b \ Units R" proof (cases "properfactor R a r") assume"properfactor R a r"thus ?thesis using a assms(2) unfolding ring_irreducible_def irreducible_def by auto next assume not_proper: "\ properfactor R a r" hence"r divides a" using r b unfolding properfactor_def by auto thenobtain c where c: "c \ carrier R" "a = r \ c" unfolding factor_def by auto have"\ = c \ b" using r c(1) b assms m_assoc m_lcancel[OF _ assms(1) one_closed m_closed[OF c(1) b]] unfolding c(2) ring_irreducible_def by auto thus ?thesis using c(1) b m_comm unfolding Units_def by auto qed qed
lemma (indomain) ring_irreducibleI: assumes"r \ carrier R - { \ }" "r \ Units R" and"\a b. \ a \ carrier R; b \ carrier R \ \ r = a \ b \ a \ Units R \ b \ Units R" shows"ring_irreducible r" unfolding ring_irreducible_def proof show"r \ \" using assms(1) by blast next show"irreducible R r" proof (rule irreducibleI[OF assms(2)]) fix a assume a: "a \ carrier R" "properfactor R a r" thenobtain b where b: "b \ carrier R" "r = a \ b" unfolding properfactor_def factor_def by blast hence"a \ Units R \ b \ Units R" using assms(3)[OF a(1) b(1)] by simp thus"a \ Units R" proof (auto) assume"b \ Units R" hence"r \ inv b = a" and "inv b \ carrier R" using b a by (simp add: m_assoc)+ thus ?thesis using a(2) unfolding properfactor_def factor_def by blast qed qed qed
lemma (indomain) ring_irreducibleI': assumes"r \ carrier R - { \ }" "irreducible (mult_of R) r" shows"ring_irreducible r" unfolding ring_irreducible_def using irreducible_mult_imp_irreducible[OF assms] assms(1) by auto
subsection \<open>Primes\<close>
lemma (indomain) zero_is_prime: "prime R \" "prime (mult_of R) \" using integral unfolding prime_def factor_def Units_def by auto
lemma (indomain) prime_eq_prime_mult: assumes"p \ carrier R" shows"prime R p \ prime (mult_of R) p" proof (cases "p = \", auto simp add: zero_is_prime) assume"p \ \" "prime R p" thus "prime (mult_of R) p" unfolding prime_def using divides_mult_imp_divides Units_mult_eq_Units mult_mult_of by (metis DiffD1 assms carrier_mult_of divides_imp_divides_mult) next assume p: "p \ \" "prime (mult_of R) p" show "prime R p" proof (rule primeI) show"p \ Units R" using p(2) Units_mult_eq_Units unfolding prime_def by simp next fix a b assume a: "a \ carrier R" and b: "b \ carrier R" and dvd: "p divides a \ b" thenobtain c where c: "c \ carrier R" "a \ b = p \ c" unfolding factor_def by auto show"p divides a \ p divides b" proof (cases "a \ b = \") case True thus ?thesis using integral[OF _ a b] c unfolding factor_def by force next case False hence"p divides\<^bsub>(mult_of R)\<^esub> (a \ b)" using divides_imp_divides_mult[OF assms _ dvd] m_closed[OF a b] by simp moreoverhave"a \ \" "b \ \" "c \ \" using False a b c p l_null integral_iff by (auto, simp add: assms) ultimatelyshow ?thesis using a b p unfolding prime_def by (auto, metis Diff_iff divides_mult_imp_divides singletonD) qed qed qed
lemma (indomain) ring_primeE: assumes"p \ carrier R" "ring_prime p" shows"p \ \" "prime (mult_of R) p" "prime R p" using assms prime_eq_prime_mult unfolding ring_prime_def by auto
lemma (in ring) ring_primeI: (* in ring only to avoid instantiating R *) assumes"p \ \" "prime R p" shows "ring_prime p" using assms unfolding ring_prime_def by auto
lemma (indomain) ring_primeI': assumes"p \ carrier R - { \ }" "prime (mult_of R) p" shows"ring_prime p" using assms prime_eq_prime_mult unfolding ring_prime_def by auto
subsection \<open>Basic Properties\<close>
lemma (in cring) to_contain_is_to_divide: assumes"a \ carrier R" "b \ carrier R" shows"PIdl b \ PIdl a \ a divides b" 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 qed show"a divides b \ PIdl b \ PIdl a" proof - assume"a divides b"thenobtain c where c: "c \ carrier R" "b = c \ a" unfolding factor_def using m_comm[OF assms(1)] by blast show"PIdl b \ PIdl a" proof fix x assume"x \ PIdl b" thenobtain d where d: "d \ carrier R" "x = d \ b" unfolding cgenideal_def by blast hence"x = (d \ c) \ a" using c d m_assoc assms by simp thus"x \ PIdl a" unfolding cgenideal_def using m_assoc assms c d by blast qed qed qed
lemma (in cring) associated_iff_same_ideal: assumes"a \ carrier R" "b \ carrier R" shows"a \ b \ PIdl a = PIdl b" unfolding associated_def using to_contain_is_to_divide[OF assms]
to_contain_is_to_divide[OF assms(2,1)] by auto
lemma (in cring) ideal_eq_carrier_iff: assumes"a \ carrier R" shows"carrier R = PIdl a \ a \ Units R" proof assume"carrier R = PIdl a" hence"\ \ PIdl a" by auto thenobtain 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" thenhave 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
lemma (indomain) primeideal_iff_prime: assumes"p \ carrier R - { \ }" shows"primeideal (PIdl p) R \ ring_prime p" proof assume PIdl: "primeideal (PIdl p) R"show"ring_prime p" proof (rule ring_primeI) show"p \ \" using assms by simp next show"prime R p" proof (rule primeI) show"p \ Units R" using ideal_eq_carrier_iff[of p] assms primeideal.I_notcarr[OF PIdl] by auto next fix a b assume a: "a \ carrier R" and b: "b \ carrier R" and dvd: "p divides a \ b" hence"a \ b \ PIdl p" by (meson assms DiffD1 cgenideal_self contra_subsetD m_closed to_contain_is_to_divide) hence"a \ PIdl p \ b \ PIdl p" using primeideal.I_prime[OF PIdl a b] by simp thus"p divides a \ p divides b" using assms a b Idl_subset_ideal' cgenideal_eq_genideal to_contain_is_to_divide by auto qed qed next assume prime: "ring_prime p"show"primeideal (PIdl p) R" proof (rule primeidealI[OF cgenideal_ideal cring_axioms]) show"p \ carrier R" and "carrier R \ PIdl p" using ideal_eq_carrier_iff[of p] assms prime unfolding ring_prime_def prime_def by auto next fix a b assume a: "a \ carrier R" and b: "b \ carrier R" "a \ b \ PIdl p" hence"p divides a \ b" using assms Idl_subset_ideal' cgenideal_eq_genideal to_contain_is_to_divide by auto hence"p divides a \ p divides b" using a b assms primeE[OF ring_primeE(3)[OF _ prime]] by auto thus"a \ PIdl p \ b \ PIdl p" using a b assms Idl_subset_ideal' cgenideal_eq_genideal to_contain_is_to_divide by auto qed qed
subsection \<open>Noetherian Rings\<close>
lemma (in ring) chain_Union_is_ideal: assumes"subset.chain { I. ideal I R } C" shows"ideal (if C = {} then { \ } else (\C)) R" proof (cases "C = {}") case True thus ?thesis by (simp add: zeroideal) next case False have"ideal (\C) R" proof (rule idealI[OF ring_axioms]) show"subgroup (\C) (add_monoid R)" proof show"\C \ carrier (add_monoid R)" using assms subgroup.subset[OF additive_subgroup.a_subgroup] unfolding pred_on.chain_def ideal_def by auto
obtain I where I: "I \ C" "ideal I R" using False assms unfolding pred_on.chain_def by auto thus"\\<^bsub>add_monoid R\<^esub> \ \C" using additive_subgroup.zero_closed[OF ideal.axioms(1)[OF I(2)]] by auto next fix x y assume"x \ \C" "y \ \C" thenobtain I where I: "I \ C" "x \ I" "y \ I" using assms unfolding pred_on.chain_def by blast hence ideal: "ideal I R" using assms unfolding pred_on.chain_def by auto thus"x \\<^bsub>add_monoid R\<^esub> y \ \C" using UnionI I additive_subgroup.a_closed unfolding ideal_def by fastforce
show"inv\<^bsub>add_monoid R\<^esub> x \ \C" using UnionI I additive_subgroup.a_inv_closed ideal unfolding ideal_def a_inv_def by metis qed next fix a x assume a: "a \ \C" and x: "x \ carrier R" thenobtain I where I: "ideal I R""a \ I" and "I \ C" using assms unfolding pred_on.chain_def by auto thus"x \ a \ \C" and "a \ x \ \C" using ideal.I_l_closed[OF I x] ideal.I_r_closed[OF I x] by auto qed thus ?thesis using False by simp qed
lemma (in noetherian_ring) ideal_chain_is_trivial: assumes"C \ {}" "subset.chain { I. ideal I R } C" shows"\C \ C" proof - have aux_lemma: "\I. I \ C \ S \ I" if "finite S" "S \ \C" for S using that proof (induct S) case empty thus ?caseusing assms(1) by blast next case (insert s S) thenobtain I where I: "I \ C" "S \ I" by blast moreoverobtain I' where I': "I' \ C" "s \ I'" using insert(4) by blast ultimatelyhave"I \ I' \ I' \ I" using assms unfolding pred_on.chain_def by blast thus ?case using I I' by blast qed
obtain S where S: "finite S""S \ carrier R" "\C = Idl S" using finetely_gen[OF chain_Union_is_ideal[OF assms(2)]] assms(1) by auto thenobtain I where I: "I \ C" and "S \ I" using aux_lemma[OF S(1)] genideal_self[OF S(2)] by blast hence"Idl S \ I" using assms unfolding pred_on.chain_def by (metis genideal_minimal mem_Collect_eq rev_subsetD) hence"\C = I" using S(3) I by auto thus ?thesis using I by simp qed
lemma (in ring) trivial_ideal_chain_imp_noetherian: assumes"\C. \ C \ {}; subset.chain { I. ideal I R } C \ \ \C \ C" shows"noetherian_ring R" proof (rule noetherian_ringI) fix I assume I: "ideal I R" have in_carrier: "I \ carrier R" and add_subgroup: "additive_subgroup I R" using ideal.axioms(1)[OF I] additive_subgroup.a_subset by auto
define S where"S = { Idl S' | S'. S' \ I \ finite S' }" have"\M \ S. \S' \ S. M \ S' \ S' = M" proof (rule subset_Zorn) fix C assume C: "subset.chain S C" show"\U \ S. \S' \ C. S' \ U" proof (cases "C = {}") case True have"{ \ } \ S" using additive_subgroup.zero_closed[OF add_subgroup] genideal_zero by (auto simp add: S_def) thus ?thesis using True by auto next case False have"S \ { I. ideal I R }" using additive_subgroup.a_subset[OF add_subgroup] genideal_ideal by (auto simp add: S_def) hence"subset.chain { I. ideal I R } C" using C unfolding pred_on.chain_def by auto thenhave"\C \ C" using assms False by simp thus ?thesis by (meson C Union_upper pred_on.chain_def subsetCE) qed qed thenobtain M where M: "M \ S" "\S'. \S' \ S; M \ S' \ \ S' = M" by auto thenobtain S' where S': "S' \ I" "finite S'" "M = Idl S'" by (auto simp add: S_def) hence"M \ I" using I genideal_minimal by (auto simp add: S_def) moreoverhave"I \ M" proof (rule ccontr) assume"\ I \ M" thenobtain a where a: "a \ I" "a \ M" by auto have"M \ Idl (insert a S')" using S' a(1) genideal_minimal[of "Idl (insert a S')" S']
in_carrier genideal_ideal genideal_self by (meson insert_subset subset_trans) moreoverhave"Idl (insert a S') \ S" using a(1) S' by (auto simp add: S_def) ultimatelyhave"M = Idl (insert a S')" using M(2) by auto hence"a \ M" using genideal_self S'(1) a (1) in_carrier by (meson insert_subset subset_trans) from\<open>a \<in> M\<close> and \<open>a \<notin> M\<close> show False by simp qed ultimatelyhave"M = I"by simp thus"\A \ carrier R. finite A \ I = Idl A" using S' in_carrier by blast qed
lemma (in noetherian_domain) factorization_property: assumes"a \ carrier R - { \ }" "a \ Units R" shows"\fs. set fs \ carrier (mult_of R) \ wfactors (mult_of R) fs a" (is "?factorizable a") proof (rule ccontr) assume a: "\ ?factorizable a"
define S where"S = { PIdl r | r. r \ carrier R - { \ } \ r \ Units R \ \ ?factorizable r }" thenobtain C where C: "subset.maxchain S C" using subset.Hausdorff by blast hence chain: "subset.chain S C" using pred_on.maxchain_def by blast moreoverhave"S \ { I. ideal I R }" using cgenideal_ideal by (auto simp add: S_def) ultimatelyhave"subset.chain { I. ideal I R } C" by (meson dual_order.trans pred_on.chain_def) moreoverhave"PIdl a \ S" using assms a by (auto simp add: S_def) hence"subset.chain S { PIdl a }" unfolding pred_on.chain_def by auto hence"C \ {}" using C unfolding pred_on.maxchain_def by auto ultimatelyhave"\C \ C" using ideal_chain_is_trivial by simp hence"\C \ S" using chain unfolding pred_on.chain_def by auto thenobtain r where r: "\C = PIdl r" "r \ carrier R - { \ }" "r \ Units R" "\ ?factorizable r" by (auto simp add: S_def) have"\p. p \ carrier R - { \ } \ p \ Units R \ \ ?factorizable p \ p divides r \ \ r divides p" proof - have"wfactors (mult_of R) [ r ] r"if"irreducible (mult_of R) r" using r(2) that unfolding wfactors_def by auto hence"\ irreducible (mult_of R) r" using r(2,4) by auto hence"\ ring_irreducible r" using ring_irreducibleE(3) r(2) by auto thenobtain p1 p2 where p1_p2: "p1 \ carrier R" "p2 \ carrier R" "r = p1 \ p2" "p1 \ Units R" "p2 \Units R" using ring_irreducibleI[OF r(2-3)] by auto hence in_carrier: "p1 \ carrier (mult_of R)" "p2 \ carrier (mult_of R)" using r(2) by auto
have"\ ?factorizable p1; ?factorizable p2 \ \ ?factorizable r" using mult_of.wfactors_mult[OF _ _ in_carrier] p1_p2(3) by (metis le_sup_iff set_append) hence"\ ?factorizable p1 \ \ ?factorizable p2" using r(4) by auto
moreover have"\p1 p2. \ p1 \ carrier R; p2 \ carrier R; r = p1 \ p2; r divides p1 \ \ p2 \ Units R" proof - fix p1 p2 assume A: "p1 \ carrier R" "p2 \ carrier R" "r = p1 \ p2" "r divides p1" thenobtain c where c: "c \ carrier R" "p1 = r \ c" unfolding factor_def by blast hence"\ = c \ p2" using A m_lcancel[OF _ _ one_closed, of r "c \ p2"] r(2) by (auto, metis m_assoc m_closed) thus"p2 \ Units R" unfolding Units_def using c A(2) m_comm[OF c(1) A(2)] by auto qed hence"\ r divides p1" and "\ r divides p2" using p1_p2 m_comm[OF p1_p2(1-2)] by blast+
ultimatelyshow ?thesis using p1_p2 in_carrier by (metis carrier_mult_of dividesI' m_comm) qed thenobtain p where p: "p \ carrier R - { \ }" "p \ Units R" "\ ?factorizable p" "p divides r" "\ r divides p" by blast hence"PIdl p \ S" unfolding S_def by auto moreoverhave"\C \ PIdl p" using p r to_contain_is_to_divide unfolding r(1) by (metis Diff_iff psubsetI) ultimatelyhave"subset.chain S (insert (PIdl p) C)"and"C \ (insert (PIdl p) C)" unfolding pred_on.chain_def by (metis C psubsetE subset_maxchain_max, blast) thus False using C unfolding pred_on.maxchain_def by blast qed
lemma (in noetherian_domain) exists_irreducible_divisor: assumes"a \ carrier R - { \ }" and "a \ Units R" obtains b where"b \ carrier R" and "ring_irreducible b" and "b divides a" proof - obtain fs where set_fs: "set fs \ carrier (mult_of R)" and "wfactors (mult_of R) fs a" using factorization_property[OF assms] by blast hence"a \ Units R" if "fs = []" using that assms(1) Units_cong assoc_iff_assoc_mult unfolding wfactors_def by (simp, blast) hence"fs \ []" using assms(2) by auto thenobtain f' fs'where fs: "fs = f' # fs'" using list.exhaust by blast from\<open>wfactors (mult_of R) fs a\<close> have "f' divides a" using mult_of.wfactors_dividesI[OF _ set_fs] assms(1) unfolding fs by auto moreoverfrom\<open>wfactors (mult_of R) fs a\<close> have "ring_irreducible f'" and "f' \<in> carrier R" using set_fs ring_irreducibleI'[of f'] unfolding wfactors_def fs by auto ultimatelyshow thesis using that by blast qed
subsection \<open>Principal Domains\<close>
sublocale principal_domain \<subseteq> noetherian_domain proof fix I assume"ideal I R" thenobtain i where"i \ carrier R" "I = Idl { i }" using exists_gen cgenideal_eq_genideal by auto thus"\A \ carrier R. finite A \ I = Idl A" by blast qed
lemma (in principal_domain) irreducible_imp_maximalideal: assumes"p \ carrier R" and"ring_irreducible p" shows"maximalideal (PIdl p) R" proof (rule maximalidealI) show"ideal (PIdl p) R" using assms(1) by (simp add: cgenideal_ideal) next show"carrier R \ PIdl p" using ideal_eq_carrier_iff[OF assms(1)] ring_irreducibleE(4)[OF assms] by auto next fix J assume J: "ideal J R""PIdl p \ J" "J \ carrier R" thenobtain q where q: "q \ carrier R" "J = PIdl q" using exists_gen[OF J(1)] cgenideal_eq_rcos by metis hence"q divides p" using to_contain_is_to_divide[of q p] using assms(1) J(1-2) by simp thenobtain r where r: "r \ carrier R" "p = q \ r" unfolding factor_def by auto hence"q \ Units R \ r \ Units R" using ring_irreducibleE(5)[OF assms q(1)] by auto thus"J = PIdl p \ J = carrier R" proof assume"q \ Units R" thus ?thesis using ideal_eq_carrier_iff[OF q(1)] q(2) by auto next assume"r \ Units R" hence "p \ q" using assms(1) r q(1) associatedI2' by blast thus ?thesis unfolding associated_iff_same_ideal[OF assms(1) q(1)] q(2) by auto qed qed
corollary (in principal_domain) primeness_condition: assumes"p \ carrier R" shows"ring_irreducible p \ ring_prime p" proof show"ring_irreducible p \ ring_prime p" using maximalideal_prime[OF irreducible_imp_maximalideal] ring_irreducibleE(1)
primeideal_iff_prime assms by auto next show"ring_prime p \ ring_irreducible p" using mult_of.prime_irreducible ring_primeI[of p] ring_irreducibleI' assms unfolding ring_prime_def prime_eq_prime_mult[OF assms] by auto qed
lemma (in principal_domain) domain_iff_prime: assumes"a \ carrier R - { \ }" shows"domain (R Quot (PIdl a)) \ ring_prime a" using quot_domain_iff_primeideal[of "PIdl a"] primeideal_iff_prime[of a]
cgenideal_ideal[of a] assms by auto
lemma (in principal_domain) field_iff_prime: assumes"a \ carrier R - { \ }" shows"field (R Quot (PIdl a)) \ ring_prime a" proof show"ring_prime a \ field (R Quot (PIdl a))" using primeness_condition[of a] irreducible_imp_maximalideal[of a]
maximalideal.quotient_is_field[of "PIdl a" R] is_cring assms by auto next show"field (R Quot (PIdl a)) \ ring_prime a" unfolding field_def using domain_iff_prime[of a] assms by auto qed
sublocale principal_domain < mult_of: primeness_condition_monoid "mult_of R"
rewrites "mult (mult_of R) = mult R" and"one (mult_of R) = one R" unfolding primeness_condition_monoid_def
primeness_condition_monoid_axioms_def proof (auto simp add: mult_of.is_comm_monoid_cancel) fix a assume a: "a \ carrier R" "a \ \" "irreducible (mult_of R) a" show"prime (mult_of R) a" using primeness_condition[OF a(1)] irreducible_mult_imp_irreducible[OF _ a(3)] a(1-2) unfolding ring_prime_def ring_irreducible_def prime_eq_prime_mult[OF a(1)] by auto qed
sublocale principal_domain < mult_of: factorial_monoid "mult_of R"
rewrites "mult (mult_of R) = mult R" and"one (mult_of R) = one R" using mult_of.wfactors_unique factorization_property mult_of.is_comm_monoid_cancel by (auto intro!: mult_of.factorial_monoidI)
sublocale principal_domain \<subseteq> factorial_domain unfolding factorial_domain_def using domain_axioms mult_of.factorial_monoid_axioms bysimp
lemma (in principal_domain) ideal_sum_iff_gcd: assumes"a \ carrier R" "b \ carrier R" "d \ carrier R" shows"PIdl d = PIdl a <+>\<^bsub>R\<^esub> PIdl b \ d gcdof a b" proof - have aux_lemma: "d gcdof a b" if in_carrier: "a \ carrier R" "b \ carrier R" "d \ carrier R" and ideal_eq: "PIdl d = PIdl a <+>\<^bsub>R\<^esub> PIdl b" for a b d proof (auto simp add: isgcd_def) have"a \ PIdl d" and "b \ PIdl d" using in_carrier(1-2)[THEN cgenideal_ideal] additive_subgroup.zero_closed[OF ideal.axioms(1)]
in_carrier(1-2)[THEN cgenideal_self] in_carrier(1-2) unfolding ideal_eq set_add_def' by force+ thus"d divides a"and"d divides b" using in_carrier(1,2)[THEN to_contain_is_to_divide[OF in_carrier(3)]]
cgenideal_minimal[OF cgenideal_ideal[OF in_carrier(3)]] by simp+ next fix c assume c: "c \ carrier R" "c divides a" "c divides b" hence"PIdl a \ PIdl c" and "PIdl b \ PIdl c" using to_contain_is_to_divide in_carrier by auto hence"PIdl a <+>\<^bsub>R\<^esub> PIdl b \ PIdl c" by (metis Un_subset_iff c(1) in_carrier(1-2) cgenideal_ideal genideal_minimal union_genideal) thus"c divides d" using ideal_eq to_contain_is_to_divide[OF c(1) in_carrier(3)] by simp qed
have"PIdl d = PIdl a <+>\<^bsub>R\<^esub> PIdl b \ d gcdof a b" using aux_lemma assms by simp
moreover have"d gcdof a b \ PIdl d = PIdl a <+>\<^bsub>R\<^esub> PIdl b" proof - assume d: "d gcdof a b" obtain c where c: "c \ carrier R" "PIdl c = PIdl a <+>\<^bsub>R\<^esub> PIdl b" using exists_gen[OF add_ideals[OF assms(1-2)[THEN cgenideal_ideal]]] by blast hence"c gcdof a b" using aux_lemma assms by simp from\<open>d gcdof a b\<close> and \<open>c gcdof a b\<close> have "d \<sim> c" using assms c(1) by (simp add: associated_def isgcd_def) thus ?thesis using c(2) associated_iff_same_ideal[OF assms(3) c(1)] by simp qed
ultimatelyshow ?thesis by auto qed
lemma (in principal_domain) bezout_identity: assumes"a \ carrier R" "b \ carrier R" shows"PIdl a <+>\<^bsub>R\<^esub> PIdl b = PIdl (somegcd R a b)" proof - have"\d \ carrier R. d gcdof a b" using exists_gen[OF add_ideals[OF assms(1-2)[THEN cgenideal_ideal]]]
ideal_sum_iff_gcd[OF assms(1-2)] by auto thus ?thesis using ideal_sum_iff_gcd[OF assms(1-2)] somegcd_def by (metis (no_types, lifting) tfl_some) qed
subsection \<open>Euclidean Domains\<close>
sublocale euclidean_domain \<subseteq> principal_domain unfolding principal_domain_def principal_domain_axioms_def proof (auto) show"domain R"by (simp add: domain_axioms) next fix I assume I: "ideal I R"have"principalideal I R" proof (cases "I = { \ }") 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
define phi_img :: "nat set"where"phi_img = (\ ` (I - { \ }))" hence"phi_img \ {}" using A by simp thenobtain m where"m \ phi_img" "\k. k \ phi_img \ m \ k" using exists_least_iff[of "\n. n \ phi_img"] not_less by force thenobtain a where a: "a \ I - { \ }" "\b. b \ I - { \ } \ \ a \ \ b" using phi_img_def by blast have"I = PIdl a" proof (rule ccontr) assume"I \ PIdl a" thenobtain b where b: "b \ I" "b \ PIdl a" using I \<open>a \<in> I - {\<zero>}\<close> cgenideal_minimal by auto hence"b \ \" by (metis DiffD1 I a(1) additive_subgroup.zero_closed cgenideal_ideal ideal.Icarr ideal.axioms(1)) thenobtain q r where eucl_div: "q \ carrier R" "r \ carrier R" "b = (a \ q) \ r" "r = \ \ \ r < \ a" using euclidean_function[of b a] a(1) b(1) ideal.Icarr[OF I] by auto hence"r = \ \ b \ PIdl a" 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 moreoverhave"\ (a \ q) \ I" using eucl_div(1) a(1) I by (meson DiffD1 additive_subgroup.a_inv_closed ideal.I_r_closed ideal.axioms(1)) ultimatelyhave 2: "r \ I" using b(1) additive_subgroup.a_closed[OF ideal.axioms(1)[OF I]] by auto
from 1 and 2 show False using a(2) by fastforce qed thus ?thesis by (meson DiffD1 I cgenideal_is_principalideal ideal.Icarr local.a(1)) qed thus"\a \ carrier R. I = PIdl a" by (simp add: cgenideal_eq_genideal principalideal.generate) qed
sublocale field \<subseteq> euclidean_domain R "\<lambda>_. 0" proof (rule euclidean_domainI) fix a b let ?eucl_div = "\q r. q \ carrier R \ r \ carrier R \ a = b \ q \ r \ (r = \ \ 0 < 0)"
assume a: "a \ carrier R - { \ }" and b: "b \ carrier R - { \ }" hence"a = b \ ((inv b) \ a) \ \" by (metis DiffD1 Units_inv_closed Units_r_inv field_Units l_one m_assoc r_zero) hence"?eucl_div _ ((inv b) \ a) \" using a b field_Units by auto thus"\q r. ?eucl_div _ q r" by blast qed
end
¤ Dauer der Verarbeitung: 0.21 Sekunden
(vorverarbeitet)
¤