(* Title: HOL/Algebra/Chinese_Remainder.thy
Author: Paulo Emílio de Vilhena
*)
theory Chinese_Remainder
imports Weak_Morphisms Ideal_Product
begin
section \<open>Direct Product of Rings\<close>
subsection \<open>Definitions\<close>
definition RDirProd :: "('a, 'n) ring_scheme \ ('b, 'm) ring_scheme \ ('a \ 'b) ring"
where "RDirProd R S = monoid.extend (R \\ S)
\<lparr> zero = one ((add_monoid R) \<times>\<times> (add_monoid S)),
add = mult ((add_monoid R) \<times>\<times> (add_monoid S)) \<rparr> "
abbreviation nil_ring :: "('a list) ring"
where "nil_ring \ monoid.extend nil_monoid \ zero = [], add = (\a b. []) \"
definition RDirProd_list :: "(('a, 'n) ring_scheme) list \ ('a list) ring"
where "RDirProd_list Rs = foldr (\R S. image_ring (\(a, as). a # as) (RDirProd R S)) Rs nil_ring"
subsection \<open>Basic Properties\<close>
lemma RDirProd_carrier: "carrier (RDirProd R S) = carrier R \ carrier S"
unfolding RDirProd_def DirProd_def by (simp add: monoid.defs)
lemma RDirProd_add_monoid [simp]: "add_monoid (RDirProd R S) = (add_monoid R) \\ (add_monoid S)"
by (simp add: RDirProd_def monoid.defs)
lemma RDirProd_ring:
assumes "ring R" and "ring S" shows "ring (RDirProd R S)"
proof -
have "monoid (RDirProd R S)"
using DirProd_monoid[OF assms[THEN ring.axioms(2)]] unfolding monoid_def
by (auto simp add: DirProd_def RDirProd_def monoid.defs)
then interpret Prod: group "add_monoid (RDirProd R S)" + monoid "RDirProd R S"
using DirProd_group[OF assms[THEN abelian_group.a_group[OF ring.is_abelian_group]]]
unfolding RDirProd_add_monoid by auto
show ?thesis
by (unfold_locales, auto simp add: RDirProd_def DirProd_def monoid.defs assms ring.ring_simprules)
qed
lemma RDirProd_iso1:
"(\(x, y). (y, x)) \ ring_iso (RDirProd R S) (RDirProd S R)"
unfolding ring_iso_def ring_hom_def bij_betw_def inj_on_def
by (auto simp add: RDirProd_def DirProd_def monoid.defs)
lemma RDirProd_iso2:
"(\(x, (y, z)). ((x, y), z)) \ ring_iso (RDirProd R (RDirProd S T)) (RDirProd (RDirProd R S) T)"
unfolding ring_iso_def ring_hom_def bij_betw_def inj_on_def
by (auto simp add: image_iff RDirProd_def DirProd_def monoid.defs)
lemma RDirProd_iso3:
"(\((x, y), z). (x, (y, z))) \ ring_iso (RDirProd (RDirProd R S) T) (RDirProd R (RDirProd S T))"
unfolding ring_iso_def ring_hom_def bij_betw_def inj_on_def
by (auto simp add: image_iff RDirProd_def DirProd_def monoid.defs)
lemma RDirProd_iso4:
assumes "f \ ring_iso R S" shows "(\(r, t). (f r, t)) \ ring_iso (RDirProd R T) (RDirProd S T)"
using assms unfolding ring_iso_def ring_hom_def bij_betw_def inj_on_def
by (auto simp add: image_iff RDirProd_def DirProd_def monoid.defs)+
lemma RDirProd_iso5:
assumes "f \ ring_iso S T" shows "(\(r, s). (r, f s)) \ ring_iso (RDirProd R S) (RDirProd R T)"
using ring_iso_set_trans[OF ring_iso_set_trans[OF RDirProd_iso1 RDirProd_iso4[OF assms]] RDirProd_iso1]
by (simp add: case_prod_unfold comp_def)
lemma RDirProd_iso6:
assumes "f \ ring_iso R R'" and "g \ ring_iso S S'"
shows "(\(r, s). (f r, g s)) \ ring_iso (RDirProd R S) (RDirProd R' S')"
using ring_iso_set_trans[OF RDirProd_iso4[OF assms(1)] RDirProd_iso5[OF assms(2)]]
by (simp add: case_prod_beta' comp_def)
lemma RDirProd_iso7:
shows "(\a. (a, [])) \ ring_iso R (RDirProd R nil_ring)"
unfolding ring_iso_def ring_hom_def bij_betw_def inj_on_def
by (auto simp add: RDirProd_def DirProd_def monoid.defs)
lemma RDirProd_hom1:
shows "(\a. (a, a)) \ ring_hom R (RDirProd R R)"
by (auto simp add: ring_hom_def RDirProd_def DirProd_def monoid.defs)
lemma RDirProd_hom2:
assumes "f \ ring_hom S T"
shows "(\(x, y). (x, f y)) \ ring_hom (RDirProd R S) (RDirProd R T)"
and "(\(x, y). (f x, y)) \ ring_hom (RDirProd S R) (RDirProd T R)"
using assms by (auto simp add: ring_hom_def RDirProd_def DirProd_def monoid.defs)
lemma RDirProd_hom3:
assumes "f \ ring_hom R R'" and "g \ ring_hom S S'"
shows "(\(r, s). (f r, g s)) \ ring_hom (RDirProd R S) (RDirProd R' S')"
using ring_hom_trans[OF RDirProd_hom2(2)[OF assms(1)] RDirProd_hom2(1)[OF assms(2)]]
by (simp add: case_prod_beta' comp_def)
subsection \<open>Direct Product of a List of Rings\<close>
lemma RDirProd_list_nil [simp]: "RDirProd_list [] = nil_ring"
unfolding RDirProd_list_def by simp
lemma nil_ring_simprules [simp]:
"carrier nil_ring = { [] }" and "one nil_ring = []" and "zero nil_ring = []"
by (auto simp add: monoid.defs)
lemma RDirProd_list_truncate:
shows "monoid.truncate (RDirProd_list Rs) = DirProd_list Rs"
proof (induct Rs, simp add: RDirProd_list_def DirProd_list_def monoid.defs)
case (Cons R Rs)
have "monoid.truncate (RDirProd_list (R # Rs)) =
monoid.truncate (image_ring (\<lambda>(a, as). a # as) (RDirProd R (RDirProd_list Rs)))"
unfolding RDirProd_list_def by simp
also have " ... = image_group (\(a, as). a # as) (monoid.truncate (RDirProd R (RDirProd_list Rs)))"
by (simp add: image_ring_def image_group_def monoid.defs)
also have " ... = image_group (\(a, as). a # as) (R \\ (monoid.truncate (RDirProd_list Rs)))"
by (simp add: RDirProd_def DirProd_def monoid.defs)
also have " ... = DirProd_list (R # Rs)"
unfolding Cons DirProd_list_def by simp
finally show ?case .
qed
lemma RDirProd_list_carrier_def':
shows "carrier (RDirProd_list Rs) = carrier (DirProd_list Rs)"
proof -
have "carrier (RDirProd_list Rs) = carrier (monoid.truncate (RDirProd_list Rs))"
by (simp add: monoid.defs)
thus ?thesis
unfolding RDirProd_list_truncate .
qed
lemma RDirProd_list_carrier:
shows "carrier (RDirProd_list (G # Gs)) = (\(x, xs). x # xs) ` (carrier G \ carrier (RDirProd_list Gs))"
unfolding RDirProd_list_carrier_def' using DirProd_list_carrier .
lemma RDirProd_list_one:
shows "one (RDirProd_list Rs) = foldr (\R tl. (one R) # tl) Rs []"
unfolding RDirProd_list_def RDirProd_def image_ring_def image_group_def
by (induct Rs) (auto simp add: monoid.defs)
lemma RDirProd_list_zero:
shows "zero (RDirProd_list Rs) = foldr (\R tl. (zero R) # tl) Rs []"
unfolding RDirProd_list_def RDirProd_def image_ring_def
by (induct Rs) (auto simp add: monoid.defs)
lemma RDirProd_list_zero':
shows "zero (RDirProd_list (R # Rs)) = (zero R) # (zero (RDirProd_list Rs))"
unfolding RDirProd_list_zero by simp
lemma RDirProd_list_carrier_mem:
assumes "as \ carrier (RDirProd_list Rs)"
shows "length as = length Rs" and "\i. i < length Rs \ (as ! i) \ carrier (Rs ! i)"
using assms DirProd_list_carrier_mem unfolding RDirProd_list_carrier_def' by auto
lemma RDirProd_list_carrier_memI:
assumes "length as = length Rs" and "\i. i < length Rs \ (as ! i) \ carrier (Rs ! i)"
shows "as \ carrier (RDirProd_list Rs)"
using assms DirProd_list_carrier_memI unfolding RDirProd_list_carrier_def' by auto
lemma inj_on_RDirProd_carrier:
shows "inj_on (\(a, as). a # as) (carrier (RDirProd R (RDirProd_list Rs)))"
unfolding RDirProd_def DirProd_def inj_on_def by auto
lemma RDirProd_list_is_ring:
assumes "\i. i < length Rs \ ring (Rs ! i)" shows "ring (RDirProd_list Rs)"
using assms
proof (induct Rs)
case Nil thus ?case
unfolding RDirProd_list_def by (unfold_locales, auto simp add: monoid.defs Units_def)
next
case (Cons R Rs)
hence is_ring: "ring (RDirProd R (RDirProd_list Rs))"
using RDirProd_ring[of R "RDirProd_list Rs"] by force
show ?case
using ring.inj_imp_image_ring_is_ring[OF is_ring inj_on_RDirProd_carrier]
unfolding RDirProd_list_def by auto
qed
lemma RDirProd_list_iso1:
"(\(a, as). a # as) \ ring_iso (RDirProd R (RDirProd_list Rs)) (RDirProd_list (R # Rs))"
using inj_imp_image_ring_iso[OF inj_on_RDirProd_carrier] unfolding RDirProd_list_def by auto
lemma RDirProd_list_iso2:
"Hilbert_Choice.inv (\(a, as). a # as) \ ring_iso (RDirProd_list (R # Rs)) (RDirProd R (RDirProd_list Rs))"
unfolding RDirProd_list_def by (auto intro: inj_imp_image_ring_inv_iso simp add: inj_def)
lemma RDirProd_list_iso3:
"(\a. [ a ]) \ ring_iso R (RDirProd_list [ R ])"
proof -
have [simp]: "(\a. [ a ]) = (\(a, as). a # as) \ (\a. (a, []))" by auto
show ?thesis
using ring_iso_set_trans[OF RDirProd_iso7] RDirProd_list_iso1[of R "[]"]
unfolding RDirProd_list_def by simp
qed
lemma RDirProd_list_hom1:
"(\(a, as). a # as) \ ring_hom (RDirProd R (RDirProd_list Rs)) (RDirProd_list (R # Rs))"
using RDirProd_list_iso1 unfolding ring_iso_def by auto
lemma RDirProd_list_hom2:
assumes "f \ ring_hom R S" shows "(\a. [ f a ]) \ ring_hom R (RDirProd_list [ S ])"
proof -
have hom1: "(\a. (a, [])) \ ring_hom R (RDirProd R nil_ring)"
using RDirProd_iso7 unfolding ring_iso_def by auto
have hom2: "(\(a, as). a # as) \ ring_hom (RDirProd S nil_ring) (RDirProd_list [ S ])"
using RDirProd_list_hom1[of _ "[]"] unfolding RDirProd_list_def by auto
have [simp]: "(\(a, as). a # as) \ ((\(x, y). (f x, y)) \ (\a. (a, []))) = (\a. [ f a ])" by auto
show ?thesis
using ring_hom_trans[OF ring_hom_trans[OF hom1 RDirProd_hom2(2)[OF assms]] hom2] by simp
qed
section \<open>Chinese Remainder Theorem\<close>
subsection \<open>Definitions\<close>
abbreviation (in ring) canonical_proj :: "'a set \ 'a set \ 'a \ 'a set \ 'a set"
where "canonical_proj I J \ (\a. (I +> a, J +> a))"
definition (in ring) canonical_proj_ext :: "(nat \ 'a set) \ nat \ 'a \ ('a set) list"
where "canonical_proj_ext I n = (\a. map (\i. (I i) +> a) [0..< Suc n])"
subsection \<open>Chinese Remainder Simple\<close>
lemma (in ring) canonical_proj_is_surj:
assumes "ideal I R" "ideal J R" and "I <+> J = carrier R"
shows "(canonical_proj I J) ` carrier R = carrier (RDirProd (R Quot I) (R Quot J))"
unfolding RDirProd_def DirProd_def FactRing_def A_RCOSETS_def'
proof (auto simp add: monoid.defs)
{ fix I i assume "ideal I R" "i \ I" hence "I +> i = \\<^bsub>R Quot I\<^esub>"
using a_rcos_zero by (simp add: FactRing_def)
} note aux_lemma1 = this
{ fix I i j assume A: "ideal I R" "i \ I" "j \ carrier R" "i \ j = \"
have "(I +> i) \\<^bsub>R Quot I\<^esub> (I +> j) = I +> \"
using ring_hom_memE(3)[OF ideal.rcos_ring_hom ideal.Icarr[OF _ A(2)] A(3)] A(1,4) by simp
moreover have "I +> i = I"
using abelian_subgroupI3[OF ideal.axioms(1) is_abelian_group]
by (simp add: A(1-2) abelian_subgroup.a_rcos_const)
moreover have "I +> j \ carrier (R Quot I)" and "I = \\<^bsub>R Quot I\<^esub>" and "I +> \ = \\<^bsub>R Quot I\<^esub>"
by (auto simp add: FactRing_def A_RCOSETS_def' A(3))
ultimately have "I +> j = \\<^bsub>R Quot I\<^esub>"
using ring.ring_simprules(8)[OF ideal.quotient_is_ring[OF A(1)]] by simp
} note aux_lemma2 = this
interpret I: ring "R Quot I" + J: ring "R Quot J"
using assms(1-2)[THEN ideal.quotient_is_ring] by auto
fix a b assume a: "a \ carrier R" and b: "b \ carrier R"
have "\ \ I <+> J"
using assms(3) by blast
then obtain i j where i: "i \ carrier R" "i \ I" and j: "j \ carrier R" "j \ J" and ij: "i \ j = \"
using assms(1-2)[THEN ideal.Icarr] unfolding set_add_def' by auto
hence rcos_j: "I +> j = \\<^bsub>R Quot I\<^esub>" and rcos_i: "J +> i = \\<^bsub>R Quot J\<^esub>"
using assms(1-2)[THEN aux_lemma2] a_comm by simp+
define s where "s = (a \ j) \ (b \ i)"
hence "s \ carrier R"
using a b i j by simp
have "I +> s = ((I +> a) \\<^bsub>R Quot I\<^esub> (I +> j)) \\<^bsub>R Quot I\<^esub> (I +> (b \ i))"
using ring_hom_memE(2-3)[OF ideal.rcos_ring_hom[OF assms(1)]]
by (simp add: a b i(1) j(1) s_def)
moreover have "I +> a \ carrier (R Quot I)"
by (auto simp add: FactRing_def A_RCOSETS_def' a)
ultimately have "I +> s = I +> a"
unfolding rcos_j aux_lemma1[OF assms(1) ideal.I_l_closed[OF assms(1) i(2) b]] by simp
have "J +> s = (J +> (a \ j)) \\<^bsub>R Quot J\<^esub> ((J +> b) \\<^bsub>R Quot J\<^esub> (J +> i))"
using ring_hom_memE(2-3)[OF ideal.rcos_ring_hom[OF assms(2)]]
by (simp add: a b i(1) j(1) s_def)
moreover have "J +> b \ carrier (R Quot J)"
by (auto simp add: FactRing_def A_RCOSETS_def' b)
ultimately have "J +> s = J +> b"
unfolding rcos_i aux_lemma1[OF assms(2) ideal.I_l_closed[OF assms(2) j(2) a]] by simp
from \<open>I +> s = I +> a\<close> and \<open>J +> s = J +> b\<close> and \<open>s \<in> carrier R\<close>
show "(I +> a, J +> b) \ (canonical_proj I J) ` carrier R" by blast
qed
lemma (in ring) canonical_proj_ker:
assumes "ideal I R" and "ideal J R"
shows "a_kernel R (RDirProd (R Quot I) (R Quot J)) (canonical_proj I J) = I \ J"
proof
show "a_kernel R (RDirProd (R Quot I) (R Quot J)) (canonical_proj I J) \ I \ J"
unfolding FactRing_def RDirProd_def DirProd_def a_kernel_def'
by (auto simp add: assms[THEN ideal.rcos_const_imp_mem] monoid.defs)
next
show "I \ J \ a_kernel R (RDirProd (R Quot I) (R Quot J)) (canonical_proj I J)"
proof
fix s assume s: "s \ I \ J" then have "I +> s = I" and "J +> s = J"
using abelian_subgroupI3[OF ideal.axioms(1) is_abelian_group]
by (simp add: abelian_subgroup.a_rcos_const assms)+
thus "s \ a_kernel R (RDirProd (R Quot I) (R Quot J)) (canonical_proj I J)"
unfolding FactRing_def RDirProd_def DirProd_def a_kernel_def'
using ideal.Icarr[OF assms(1)] s by (simp add: monoid.defs)
qed
qed
lemma (in ring) canonical_proj_is_hom:
assumes "ideal I R" and "ideal J R"
shows "(canonical_proj I J) \ ring_hom R (RDirProd (R Quot I) (R Quot J))"
unfolding RDirProd_def DirProd_def FactRing_def A_RCOSETS_def'
by (auto intro!: ring_hom_memI
simp add: assms[THEN ideal.rcoset_mult_add]
assms[THEN ideal.a_rcos_sum] monoid.defs)
lemma (in ring) canonical_proj_ring_hom:
assumes "ideal I R" and "ideal J R"
shows "ring_hom_ring R (RDirProd (R Quot I) (R Quot J)) (canonical_proj I J)"
using ring_hom_ring.intro[OF ring_axioms RDirProd_ring[OF assms[THEN ideal.quotient_is_ring]]]
by (simp add: ring_hom_ring_axioms_def canonical_proj_is_hom[OF assms])
theorem (in ring) chinese_remainder_simple:
assumes "ideal I R" "ideal J R" and "I <+> J = carrier R"
shows "R Quot (I \ J) \ RDirProd (R Quot I) (R Quot J)"
using ring_hom_ring.FactRing_iso[OF canonical_proj_ring_hom canonical_proj_is_surj]
by (simp add: canonical_proj_ker assms)
subsection \<open>Chinese Remainder Generalized\<close>
lemma (in ring) canonical_proj_ext_zero [simp]: "(canonical_proj_ext I 0) = (\a. [ (I 0) +> a ])"
unfolding canonical_proj_ext_def by simp
lemma (in ring) canonical_proj_ext_tl:
"(\a. canonical_proj_ext I (Suc n) a) = (\a. ((I 0) +> a) # (canonical_proj_ext (\i. I (Suc i)) n a))"
unfolding canonical_proj_ext_def by (induct n) (auto, metis (lifting) append.assoc append_Cons append_Nil)
lemma (in ring) canonical_proj_ext_is_hom:
assumes "\i. i \ n \ ideal (I i) R"
shows "(canonical_proj_ext I n) \ ring_hom R (RDirProd_list (map (\i. R Quot (I i)) [0..< Suc n]))"
using assms
proof (induct n arbitrary: I)
case 0 thus ?case
using RDirProd_list_hom2[OF ideal.rcos_ring_hom[of _ R]] by (simp add: canonical_proj_ext_def)
next
let ?DirProd = "\I n. RDirProd_list (map (\i. R Quot (I i)) [0..
let ?proj = "\I n. canonical_proj_ext I n"
case (Suc n)
hence I: "ideal (I 0) R" by simp
have hom: "(?proj (\i. I (Suc i)) n) \ ring_hom R (?DirProd (\i. I (Suc i)) n)"
using Suc(1)[of "\i. I (Suc i)"] Suc(2) by simp
have [simp]:
"(\(a, as). a # as) \ ((\(r, s). (I 0 +> r, ?proj (\i. I (Suc i)) n s)) \ (\a. (a, a))) = ?proj I (Suc n)"
unfolding canonical_proj_ext_tl by auto
moreover have
"(R Quot I 0) # (map (\i. R Quot I (Suc i)) [0..< Suc n]) = map (\i. R Quot (I i)) [0..< Suc (Suc n)]"
by (induct n) (auto)
moreover show ?case
using ring_hom_trans[OF ring_hom_trans[OF RDirProd_hom1
RDirProd_hom3[OF ideal.rcos_ring_hom[OF I] hom]] RDirProd_list_hom1]
unfolding calculation(2) by simp
qed
lemma (in ring) RDirProd_Quot_list_is_ring:
assumes "\i. i \ n \ ideal (I i) R" shows "ring (RDirProd_list (map (\i. R Quot (I i)) [0..< Suc n]))"
proof -
have ring_list: "\i. i < Suc n \ ring ((map (\i. R Quot I i) [0..< Suc n]) ! i)"
using ideal.quotient_is_ring[OF assms]
by (metis add.left_neutral diff_zero le_simps(2) nth_map_upt)
show ?thesis
using RDirProd_list_is_ring[OF ring_list] by simp
qed
lemma (in ring) canonical_proj_ext_ring_hom:
assumes "\i. i \ n \ ideal (I i) R"
shows "ring_hom_ring R (RDirProd_list (map (\i. R Quot (I i)) [0..< Suc n])) (canonical_proj_ext I n)"
proof -
have ring: "ring (RDirProd_list (map (\i. R Quot (I i)) [0..< Suc n]))"
using RDirProd_Quot_list_is_ring[OF assms] by simp
show ?thesis
using canonical_proj_ext_is_hom assms ring_hom_ring.intro[OF ring_axioms ring]
unfolding ring_hom_ring_axioms_def by blast
qed
lemma (in ring) canonical_proj_ext_ker:
assumes "\i. i \ (n :: nat) \ ideal (I i) R"
shows "a_kernel R (RDirProd_list (map (\i. R Quot (I i)) [0..< Suc n])) (canonical_proj_ext I n) = (\i \ n. I i)"
proof -
let ?map_Quot = "\I n. map (\i. R Quot (I i)) [0..< Suc n]"
let ?ker = "\I n. a_kernel R (RDirProd_list (?map_Quot I n)) (canonical_proj_ext I n)"
from assms show ?thesis
proof (induct n arbitrary: I)
case 0 then have I: "ideal (I 0) R" by simp
show ?case
unfolding a_kernel_def' RDirProd_list_zero canonical_proj_ext_def FactRing_def
using ideal.rcos_const_imp_mem a_rcos_zero ideal.Icarr I by auto
next
case (Suc n)
hence I: "ideal (I 0) R" by simp
have map_simp: "?map_Quot I (Suc n) = (R Quot I 0) # (?map_Quot (\i. I (Suc i)) n)"
by (induct n) (auto)
have ker_I0: "I 0 = a_kernel R (R Quot (I 0)) (\a. (I 0) +> a)"
using ideal.rcos_const_imp_mem[OF I] a_rcos_zero[OF I] ideal.Icarr[OF I]
unfolding a_kernel_def' FactRing_def by auto
hence "?ker I (Suc n) = (?ker (\i. I (Suc i)) n) \ (I 0)"
unfolding a_kernel_def' map_simp RDirProd_list_zero' canonical_proj_ext_tl by auto
moreover have "?ker (\i. I (Suc i)) n = (\i \ n. I (Suc i))"
using Suc(1)[of "\i. I (Suc i)"] Suc(2) by auto
ultimately show ?case
by (auto simp add: INT_extend_simps(10) atMost_atLeast0)
(metis atLeastAtMost_iff le_zero_eq not_less_eq_eq)
qed
qed
lemma (in cring) canonical_proj_ext_is_surj:
assumes "\i. i \ n \ ideal (I i) R" and "\i j. \ i \ n; j \ n \ \ i \ j \ I i <+> I j = carrier R"
shows "(canonical_proj_ext I n) ` carrier R = carrier (RDirProd_list (map (\i. R Quot (I i)) [0..< Suc n]))"
using assms
proof (induct n arbitrary: I)
case 0 show ?case
by (auto simp add: RDirProd_list_carrier FactRing_def A_RCOSETS_def')
next
{ fix S :: "'c ring" and T :: "'d ring" and f g
assume A: "ring T" "f \ ring_hom R S" "g \ ring_hom R T" "f ` carrier R \ f ` (a_kernel R T g)"
have "(\a. (f a, g a)) ` carrier R = (f ` carrier R) \ (g ` carrier R)"
proof
show "(\a. (f a, g a)) ` carrier R \ (f ` carrier R) \ (g ` carrier R)"
by blast
next
show "(f ` carrier R) \ (g ` carrier R) \ (\a. (f a, g a)) ` carrier R"
proof
fix t assume "t \ (f ` carrier R) \ (g ` carrier R)"
then obtain a b where a: "a \ carrier R" "f a = fst t" and b: "b \ carrier R" "g b = snd t"
by auto
obtain c where c: "c \ a_kernel R T g" "f c = f (a \ b)"
using A(4) minus_closed[OF a(1) b (1)] by auto
have "f (c \ b) = f (a \ b) \\<^bsub>S\<^esub> f b"
using ring_hom_memE(3)[OF A(2)] b c unfolding a_kernel_def' by auto
hence "f (c \ b) = f a"
using ring_hom_memE(3)[OF A(2) minus_closed[of a b], of b] a b by algebra
moreover have "g (c \ b) = g b"
using ring_hom_memE(1,3)[OF A(3)] b(1) c ring.ring_simprules(8)[OF A(1)]
unfolding a_kernel_def' by auto
ultimately have "(\a. (f a, g a)) (c \ b) = t" and "c \ b \ carrier R"
using a b c unfolding a_kernel_def' by auto
thus "t \ (\a. (f a, g a)) ` carrier R"
by blast
qed
qed } note aux_lemma = this
let ?map_Quot = "\I n. map (\i. R Quot (I i)) [0..< Suc n]"
let ?DirProd = "\I n. RDirProd_list (?map_Quot I n)"
let ?proj = "\I n. canonical_proj_ext I n"
case (Suc n)
interpret I: ideal "I 0" R + Inter: ideal "\i \ n. I (Suc i)" R
using i_Intersect[of "(\i. I (Suc i)) ` {..n}"] Suc(2) by auto
have map_simp: "?map_Quot I (Suc n) = (R Quot I 0) # (?map_Quot (\i. I (Suc i)) n)"
by (induct n) (auto)
have IH: "(?proj (\i. I (Suc i)) n) ` carrier R = carrier (?DirProd (\i. I (Suc i)) n)"
and ring: "ring (?DirProd (\i. I (Suc i)) n)"
and hom: "?proj (\i. I (Suc i)) n \ ring_hom R (?DirProd (\i. I (Suc i)) n)"
using RDirProd_Quot_list_is_ring[of n "\i. I (Suc i)"] Suc(1)[of "\i. I (Suc i)"]
canonical_proj_ext_is_hom[of n "\i. I (Suc i)"] Suc(2-3) by auto
have ker: "a_kernel R (?DirProd (\i. I (Suc i)) n) (?proj (\i. I (Suc i)) n) = (\i \ n. I (Suc i))"
using canonical_proj_ext_ker[of n "\i. I (Suc i)"] Suc(2) by auto
have carrier_Quot: "carrier (R Quot (I 0)) = (\a. (I 0) +> a) ` carrier R"
by (auto simp add: RDirProd_list_carrier FactRing_def A_RCOSETS_def')
have ring: "ring (?DirProd (\i. I (Suc i)) n)"
and hom: "?proj (\i. I (Suc i)) n \ ring_hom R (?DirProd (\i. I (Suc i)) n)"
using RDirProd_Quot_list_is_ring[of n "\i. I (Suc i)"]
canonical_proj_ext_is_hom[of n "\i. I (Suc i)"] Suc(2) by auto
have "carrier (R Quot (I 0)) \ (\a. (I 0) +> a) ` (\i \ n. I (Suc i))"
proof
have "(\i \ {Suc 0.. Suc n}. I i) <+> (I 0) = carrier R"
using inter_plus_ideal_eq_carrier_arbitrary[of n I 0]
by (simp add: Suc(2-3) atLeast1_atMost_eq_remove0)
hence eq_carrier: "(I 0) <+> (\i \ n. I (Suc i)) = carrier R"
using set_add_comm[OF I.a_subset Inter.a_subset]
by (metis INT_extend_simps(10) atMost_atLeast0 image_Suc_atLeastAtMost)
fix b assume "b \ carrier (R Quot (I 0))"
hence "(b, (\i \ n. I (Suc i))) \ carrier (R Quot I 0) \ carrier (R Quot (\i\n. I (Suc i)))"
using ring.ring_simprules(2)[OF Inter.quotient_is_ring] by (simp add: FactRing_def)
then obtain s
where "s \ carrier R" "(canonical_proj (I 0) (\i \ n. I (Suc i))) s = (b, (\i \ n. I (Suc i)))"
using canonical_proj_is_surj[OF I.is_ideal Inter.is_ideal eq_carrier]
unfolding RDirProd_carrier by (metis (no_types, lifting) imageE)
hence "s \ (\i \ n. I (Suc i))" and "(\a. (I 0) +> a) s = b"
using Inter.rcos_const_imp_mem by auto
thus "b \ (\a. (I 0) +> a) ` (\i \ n. I (Suc i))"
by auto
qed
hence "(\a. ((I 0) +> a, ?proj (\i. I (Suc i)) n a)) ` carrier R =
carrier (R Quot (I 0)) \<times> carrier (?DirProd (\<lambda>i. I (Suc i)) n)"
using aux_lemma[OF ring I.rcos_ring_hom hom] unfolding carrier_Quot ker IH by simp
moreover show ?case
unfolding map_simp RDirProd_list_carrier sym[OF calculation(1)] canonical_proj_ext_tl by auto
qed
theorem (in cring) chinese_remainder:
assumes "\i. i \ n \ ideal (I i) R" and "\i j. \ i \ n; j \ n \ \ i \ j \ I i <+> I j = carrier R"
shows "R Quot (\i \ n. I i) \ RDirProd_list (map (\i. R Quot (I i)) [0..< Suc n])"
using ring_hom_ring.FactRing_iso[OF canonical_proj_ext_ring_hom, of n I]
canonical_proj_ext_is_surj[of n I] canonical_proj_ext_ker[of n I] assms
by auto
end
¤ Dauer der Verarbeitung: 0.26 Sekunden
(vorverarbeitet)
¤
|
Haftungshinweis
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.
|