(** Algebra6 author Hidetsune Kobayashi Group You Santo Department of Mathematics Nihon University hikoba@math.cst.nihon-u.ac.jp May 3, 2004. April 6, 2007 (revised) chapter 4. Ring theory section 14. the degree of a polynomial(continued) section 15. homomorphism of polynomial rings section 16. relatively prime polynomials **) theory Algebra6 imports Algebra5 begin constdefs s_cf::"[('a, 'm) Ring_scheme, ('a, 'm1) Ring_scheme, 'a, 'a] => nat × (nat => 'a)" "s_cf R S X p == if p = \<zero>R then (0, λj. \<zero>S) else SOME c. (pol_coeff S c ∧ p = polyn_expr R X (fst c) c ∧ (snd c) (fst c) ≠ \<zero>S)" (* special coefficients for p *) lcf::"[('a, 'm) Ring_scheme, ('a, 'm1) Ring_scheme, 'a, 'a] => 'a" "lcf R S X p == (snd (s_cf R S X p)) (fst (s_cf R S X p))" lemma (in PolynRg) lcf_val_0:"lcf R S X \<zero> = \<zero>S" by (simp add:lcf_def s_cf_def) lemma (in PolynRg) lcf_val:"[|p ∈ carrier R; p ≠ \<zero> |] ==> lcf R S X p = (snd (s_cf R S X p)) (fst (s_cf R S X p))" by (simp add:lcf_def) lemma (in PolynRg) s_cf_pol_coeff:"p ∈ carrier R ==> pol_coeff S (s_cf R S X p)" apply (simp add:s_cf_def) apply (case_tac "p = \<zero>R", simp) apply (cut_tac subring, frule subring_Ring, simp add:pol_coeff_def Ring.ring_zero) apply simp apply (rule someI2_ex) apply (frule ex_polyn_expr[of p], erule exE, erule conjE) apply (frule_tac c = c in coeff_max_bddTr) apply (frule_tac c = c and n = "c_max S c" in pol_coeff_le, assumption) apply (subgoal_tac "p = polyn_expr R X (fst (c_max S c, snd c)) (c_max S c, snd c) ∧ snd (c_max S c, snd c) (fst (c_max S c, snd c)) ≠ \<zero>S", blast) apply (rule conjI, simp) apply (subst polyn_expr_short[THEN sym], assumption+) apply (simp add:polyn_c_max) apply simp apply (rule coeff_max_nonzeroTr, assumption) apply (simp add:coeff_0_pol_0[THEN sym]) apply simp done lemma (in PolynRg) lcf_mem:"p ∈ carrier R ==> (lcf R S X p) ∈ carrier S" apply (cut_tac subring, frule subring_Ring) apply (simp add:lcf_def) apply (cut_tac pol_coeff_mem[of "s_cf R S X p" "fst (s_cf R S X p)"], assumption, rule s_cf_pol_coeff, assumption, simp) done lemma (in PolynRg) s_cf_expr0:"p ∈ carrier R ==> pol_coeff S (s_cf R S X p) ∧ p = polyn_expr R X (fst (s_cf R S X p)) (s_cf R S X p)" apply (cut_tac subring, frule subring_Ring) apply (simp add:s_cf_def) apply (case_tac "p = \<zero>R", simp) apply (rule conjI, simp add:pol_coeff_def, simp add:Ring.ring_zero) apply (simp add:polyn_expr_def, simp add:Subring_zero_ring_zero, simp add:ring_r_one) apply simp apply (rule someI2_ex) apply (frule ex_polyn_expr[of p], erule exE, erule conjE) apply (frule_tac c = c in coeff_max_bddTr) apply (frule_tac c = c and n = "c_max S c" in pol_coeff_le, assumption) apply (subgoal_tac "p = polyn_expr R X (fst (c_max S c, snd c)) (c_max S c, snd c) ∧ snd (c_max S c, snd c) (fst (c_max S c, snd c)) ≠ \<zero>S", blast) apply (rule conjI, simp) apply (subst polyn_expr_short[THEN sym], assumption+) apply (simp add:polyn_c_max) apply simp apply (rule coeff_max_nonzeroTr, assumption) apply (simp add:coeff_0_pol_0[THEN sym]) apply simp done lemma (in PolynRg) pos_deg_nonzero:"[|p ∈ carrier R; 0 < deg_n R S X p|] ==> p ≠ \<zero>" apply (cut_tac s_cf_expr0[of p], (erule conjE)+) apply (frule pol_deg_eq_c_max[of p "s_cf R S X p"], assumption+) apply (simp, thin_tac "deg_n R S X p = c_max S (s_cf R S X p)") apply (simp add:c_max_def) apply (case_tac "∀x≤fst (s_cf R S X p). snd (s_cf R S X p) x = \<zero>S ", simp) apply (thin_tac "0 < (if ∀x≤fst (s_cf R S X p). snd (s_cf R S X p) x = \<zero>S then 0 else n_max {j. j ≤ fst (s_cf R S X p) ∧ snd (s_cf R S X p) j ≠ \<zero>S})") apply (simp add:coeff_0_pol_0[of "s_cf R S X p" "fst (s_cf R S X p)"]) apply assumption done lemma (in PolynRg) s_cf_expr:"[|p ∈ carrier R; p ≠ \<zero>|] ==> pol_coeff S (s_cf R S X p) ∧ p = polyn_expr R X (fst (s_cf R S X p)) (s_cf R S X p) ∧ (snd (s_cf R S X p)) (fst (s_cf R S X p)) ≠ \<zero>S" apply (simp add:s_cf_def) apply (rule someI2_ex) apply (frule ex_polyn_expr[of p], erule exE, erule conjE) apply (frule_tac c = c in coeff_max_bddTr) apply (frule_tac c = c and n = "c_max S c" in pol_coeff_le, assumption) apply (subgoal_tac "p = polyn_expr R X (fst (c_max S c, snd c)) (c_max S c, snd c) ∧ snd (c_max S c, snd c) (fst (c_max S c, snd c)) ≠ \<zero>S", blast) apply (rule conjI, simp) apply (subst polyn_expr_short[THEN sym], assumption+) apply (simp add:polyn_c_max) apply simp apply (rule coeff_max_nonzeroTr, assumption) apply (simp add:coeff_0_pol_0[THEN sym]) apply simp done lemma (in PolynRg) lcf_nonzero:"[|p ∈ carrier R; p ≠ \<zero> |] ==> lcf R S X p ≠ \<zero>S" apply (frule s_cf_expr[of p], assumption) apply (simp add:lcf_def) done lemma (in PolynRg) s_cf_deg:"[|p ∈ carrier R; p ≠ \<zero>|] ==> deg_n R S X p = fst (s_cf R S X p)" apply (frule s_cf_expr[of p], assumption, (erule conjE)+) apply (simp add:pol_deg_n[of p "s_cf R S X p" "fst (s_cf R S X p)"]) done lemma (in PolynRg) pol_expr_edeg:"[|p ∈ carrier R; deg R S X p ≤ (an d)|] ==> ∃f. (pol_coeff S f ∧ fst f = d ∧ p = polyn_expr R X d f)" apply (case_tac "p = \<zero>R") apply (subgoal_tac "pol_coeff S (d, λj. \<zero>S) ∧ fst (d, λj. \<zero>S) = d ∧ p = polyn_expr R X d (d, λj. \<zero>S)", blast) apply (rule conjI) apply (simp add:pol_coeff_def, cut_tac Ring.ring_zero[of S], simp, cut_tac subring, simp add:subring_Ring) apply (cut_tac coeff_0_pol_0[of "(d, λj. \<zero>S)" d], simp) apply (simp add:pol_coeff_def, cut_tac Ring.ring_zero[of S], simp, cut_tac subring, simp add:subring_Ring) apply simp apply (frule s_cf_expr[of p], assumption+, (erule conjE)+) apply (simp add:deg_def na_an, simp add:ale_natle) apply (simp add:s_cf_deg) apply (subgoal_tac "pol_coeff S (d, λj. (if j ≤ (fst (s_cf R S X p)) then (snd (s_cf R S X p) j) else \<zero>S)) ∧ p = polyn_expr R X d (d, λj. (if j ≤ (fst (s_cf R S X p)) then (snd (s_cf R S X p) j) else \<zero>S))", blast) apply (rule conjI) apply (simp add:pol_coeff_def, rule allI, rule impI, rule impI) apply (cut_tac subring, simp add:subring_Ring, simp add:subring_Ring[of S] Ring.ring_zero) apply (case_tac "fst (s_cf R S X p) = d", simp) apply (subst polyn_exprs_eq[of "(d, λj. if j ≤ d then snd (s_cf R S X p) j else \<zero>S)" "s_cf R S X p" d]) apply (simp add:pol_coeff_def, cut_tac Ring.ring_zero[of S], simp, cut_tac subring, simp add:subring_Ring, simp) apply (rule allI, rule impI, simp, assumption+) apply (drule noteq_le_less[of "fst (s_cf R S X p)" d], assumption+) apply (cut_tac polyn_n_m1[of "(d, λj. if j ≤ fst (s_cf R S X p) then snd (s_cf R S X p) j else \<zero>S)" "fst (s_cf R S X p)" d], simp) apply (cut_tac higher_part_zero[of "(d, λj. if j ≤ fst (s_cf R S X p) then snd (s_cf R S X p) j else \<zero>S)" "fst (s_cf R S X p)"], simp, thin_tac "polyn_expr R X d (d, λj. if j ≤ fst (s_cf R S X p) then snd (s_cf R S X p) j else \<zero>S) = polyn_expr R X (fst (s_cf R S X p)) (d, λj. if j ≤ fst (s_cf R S X p) then snd (s_cf R S X p) j else \<zero>S) ± \<zero>", thin_tac "Σf R (λj. (if j ≤ fst (s_cf R S X p) then snd (s_cf R S X p) j else \<zero>S) ·r X^R j) (Suc (fst (s_cf R S X p))) d = \<zero>") apply (subst polyn_exprs_eq[of "(d, λj. if j ≤ fst (s_cf R S X p) then snd (s_cf R S X p) j else \<zero>S)" "s_cf R S X p" "fst (s_cf R S X p)"]) apply (simp add:pol_coeff_def, rule allI, rule impI, rule impI, cut_tac subring, simp add:subring_Ring, simp add:subring_Ring[of S] Ring.ring_zero, assumption+) apply (simp add:min_def) apply (rule allI, rule impI, simp) apply (frule polyn_mem[of "s_cf R S X p" "fst (s_cf R S X p)"], simp+) apply (cut_tac ring_is_ag, simp add:aGroup.ag_r_zero) apply (simp add:pol_coeff_def, rule allI, rule impI, rule impI, cut_tac subring, simp add:subring_Ring, simp add:subring_Ring[of S] Ring.ring_zero) apply simp apply (rule ballI, simp add:nset_def) apply (simp add:pol_coeff_def, rule allI, rule impI, rule impI, cut_tac subring, simp add:subring_Ring, simp add:subring_Ring[of S] Ring.ring_zero) apply assumption apply simp done lemma (in PolynRg) cf_scf:"[|pol_coeff S c; k ≤ fst c; polyn_expr R X k c ≠ \<zero>|] ==> ∀j ≤ fst (s_cf R S X (polyn_expr R X k c)). snd (s_cf R S X (polyn_expr R X k c)) j = snd c j" apply (frule polyn_mem[of c k], assumption+) apply (simp add:polyn_expr_short[of c k], rule allI, rule impI) apply (cut_tac pol_deg_le_n1[of "polyn_expr R X k c" c k], frule s_cf_expr0[of "polyn_expr R X k (k, snd c)"], erule conjE) apply (rotate_tac -1, drule sym) apply (case_tac "fst (s_cf R S X (polyn_expr R X k (k, snd c))) = k", simp, cut_tac c = "s_cf R S X (polyn_expr R X k (k, snd c))" and d = "(k, snd c)" in pol_expr_unique2, simp add:s_cf_pol_coeff, simp add:split_pol_coeff, simp, simp, simp add:polyn_expr_short[THEN sym, of c k]) apply (simp add:s_cf_deg[of "polyn_expr R X k c"], drule noteq_le_less[of "fst (s_cf R S X (polyn_expr R X k c))" k], assumption) apply (frule pol_expr_unique3[of "s_cf R S X (polyn_expr R X k c)" "(k, snd c)"], simp add:split_pol_coeff, simp, simp add:polyn_expr_short[THEN sym, of c k]) apply (simp add:polyn_expr_short[THEN sym, of c k], assumption+, simp) done constdefs scf_cond::"[('a, 'm) Ring_scheme, ('a, 'm1) Ring_scheme, 'a, 'a, nat, nat × (nat => 'a)] => bool" "scf_cond R S X p d c == pol_coeff S c ∧ fst c = d ∧ p = polyn_expr R X d c" scf_d::"[('a, 'm) Ring_scheme, ('a, 'm1) Ring_scheme, 'a, 'a, nat] => nat × (nat => 'a)" "scf_d R S X p d == SOME f. scf_cond R S X p d f" (** system of coefficients, coeff_length d **) lemma (in PolynRg) scf_d_polTr:"[|p ∈ carrier R; deg R S X p ≤ an d|] ==> scf_cond R S X p d (scf_d R S X p d)" apply (simp add:scf_d_def) apply (rule_tac P = "scf_cond R S X p d" in someI2_ex) apply (frule pol_expr_edeg[of "p" "d"], assumption+) apply (simp add:scf_cond_def, assumption) done lemma (in PolynRg) scf_d_pol:"[|p ∈ carrier R; deg R S X p ≤ an d|] ==> pol_coeff S (scf_d R S X p d) ∧ fst (scf_d R S X p d) = d ∧ p = polyn_expr R X d (scf_d R S X p d)" apply (frule scf_d_polTr[of "p" "d"], assumption+) apply (simp add:scf_cond_def) done lemma (in PolynRg) pol_expr_of_X: "X = polyn_expr R X (Suc 0) (ext_cf S (Suc 0) (C0 S))" apply (cut_tac X_mem_R, cut_tac subring) apply (cut_tac X_to_d[of "Suc 0"]) apply (simp add:ring_l_one) done lemma (in PolynRg) deg_n_of_X:"deg_n R S X X = Suc 0" apply (cut_tac X_mem_R, cut_tac polyn_ring_S_nonzero, cut_tac subring) apply (cut_tac pol_expr_of_X) apply (cut_tac special_cf_pol_coeff) apply (frule ext_cf_pol_coeff[of "C0 S" "Suc 0"]) apply (frule pol_deg_eq_c_max[of X "ext_cf S (Suc 0) (C0 S)"], assumption) apply (simp add:ext_cf_len special_cf_len) apply (simp add:c_max_ext_special_cf) done lemma (in PolynRg) pol_X:"cf_sol R S X X c ==> snd c 0 = \<zero>S ∧ snd c (Suc 0) = 1rS" apply (simp add:cf_sol_def, erule conjE) apply (cut_tac pol_expr_of_X) apply (cut_tac special_cf_pol_coeff, frule ext_cf_pol_coeff[of "C0 S" "Suc 0"]) apply (cut_tac X_mem_R, cut_tac polyn_ring_X_nonzero, cut_tac subring) apply (frule pol_deg_le_n[of X c], assumption+, simp add:deg_n_of_X) apply (case_tac "fst c = Suc 0") apply (frule box_equation[of X "polyn_expr R X (Suc 0) (ext_cf S (Suc 0) (C0 S))" "polyn_expr R X (fst c) c"], assumption+, thin_tac "X = polyn_expr R X (Suc 0) (ext_cf S (Suc 0) (C0 S))", thin_tac "X = polyn_expr R X (fst c) c") apply (cut_tac pol_expr_unique2[of "ext_cf S (Suc 0) (C0 S)" c], simp, simp add:ext_cf_len special_cf_len, rule conjI, drule_tac a = 0 in forall_spec, simp, simp add:ext_special_cf_lo_zero) apply( drule_tac a = "Suc 0" in forall_spec, simp, simp add:ext_special_cf_hi, assumption+, simp add:ext_cf_len special_cf_len) apply (frule noteq_le_less[of "Suc 0" "fst c"],rule not_sym, assumption, cut_tac pol_expr_unique3[of "ext_cf S (Suc 0) (C0 S)" c], simp add:ext_cf_len special_cf_len, erule conjE, thin_tac "∀j∈nset (Suc (Suc 0)) (fst c). snd c j = \<zero>S") apply (rule conjI, drule_tac a = 0 in forall_spec, simp, simp add:ext_special_cf_lo_zero, drule_tac a = "Suc 0" in forall_spec, simp, simp add:ext_special_cf_hi, assumption+) apply (simp add:ext_cf_len special_cf_len) done lemma (in PolynRg) pol_of_deg0:"[|p ∈ carrier R; p ≠ \<zero>|] ==> (deg_n R S X p = 0) = (p ∈ carrier S)" apply (cut_tac subring, frule subring_Ring, cut_tac ring_is_ag, frule Ring.ring_is_ag[of S]) apply (rule iffI) apply (frule s_cf_expr[of p], assumption) apply (simp add:s_cf_deg, (erule conjE)+, simp add:polyn_expr_def) apply (frule pol_coeff_mem[of "s_cf R S X p" 0], simp) apply (cut_tac mem_subring_mem_ring[of S "snd (s_cf R S X p) 0"], simp add:ring_r_one, assumption+) apply (frule s_cf_expr[of p], assumption+, (erule conjE)+, simp add:s_cf_deg) apply (rule contrapos_pp, simp+) apply (subgoal_tac "pol_coeff S (0, (λj. p)) ∧ p = polyn_expr R X 0 (0, (λj. p))", erule conjE) apply (cut_tac a = "polyn_expr R X 0 (0, λj. p)" and b = "polyn_expr R X (fst (s_cf R S X p)) (s_cf R S X p)" in aGroup.ag_eq_diffzero[of R], assumption+, simp, simp) apply (frule_tac c = "polyn_expr R X (fst (s_cf R S X p)) (s_cf R S X p)" in box_equation[of p "polyn_expr R X 0 (0, λj. p)"], assumption, thin_tac "p = polyn_expr R X (fst (s_cf R S X p)) (s_cf R S X p)", thin_tac "p = polyn_expr R X 0 (0, λj. p)", simp) apply (simp only:polyn_minus_m_cf) apply (rotate_tac -2, drule sym, simp, thin_tac "polyn_expr R X (fst (s_cf R S X p)) (s_cf R S X p) = polyn_expr R X 0 (0, λj. p)") apply (frule_tac c = "s_cf R S X p" in m_cf_pol_coeff) apply (frule_tac d = "m_cf S (s_cf R S X p)" in polyn_add1[of "(0, λj. p)"], assumption, simp add:m_cf_len, thin_tac "polyn_expr R X 0 (0, λj. p) ± polyn_expr R X (fst (s_cf R S X p)) (m_cf S (s_cf R S X p)) = polyn_expr R X (fst (s_cf R S X p)) (add_cf S (0, λj. p) (m_cf S (s_cf R S X p)))") apply (rotate_tac -1, drule sym, simp) apply (frule_tac d = "m_cf S (s_cf R S X p)" in add_cf_pol_coeff[of "(0, λj. p)"], assumption) apply (frule_tac c1 = "add_cf S (0, λj. p) (m_cf S (s_cf R S X p))" and k1 = "fst (s_cf R S X p)" in coeff_0_pol_0[THEN sym], simp add:add_cf_len m_cf_len, simp, thin_tac "pol_coeff S (add_cf S (0, λj. p) (m_cf S (s_cf R S X p)))", thin_tac "polyn_expr R X (fst (s_cf R S X p)) (add_cf S (0, λj. p) (m_cf S (s_cf R S X p))) = \<zero>") apply (drule_tac a = "fst (s_cf R S X p)" in forall_spec, simp, simp add:add_cf_def m_cf_len m_cf_def) apply (frule_tac c = "s_cf R S X p" and j = "fst (s_cf R S X p)" in pol_coeff_mem, simp, frule_tac x = "snd (s_cf R S X p) (fst (s_cf R S X p))" in aGroup.ag_inv_inv[of S], assumption, simp add:aGroup.ag_inv_zero) apply (subst polyn_expr_def, simp add:ring_r_one) apply (simp add:pol_coeff_def) done lemma (in PolynRg) pols_const:"[|p ∈ carrier R; (deg R S X p) ≤ 0|] ==> p ∈ carrier S" apply (case_tac "p = \<zero>R") apply (cut_tac subring) apply (frule Subring_zero_ring_zero[THEN sym, of S], simp, cut_tac subring, frule subring_Ring[of S], rule Ring.ring_zero[of S], assumption) apply (subst pol_of_deg0[THEN sym], assumption+, simp add:deg_def, simp only:an_0[THEN sym], simp add:an_inj) done lemma (in PolynRg) less_deg_add_nonzero:"[|p ∈ carrier R; p ≠ \<zero>; q ∈ carrier R; q ≠ \<zero>; (deg_n R S X p) < (deg_n R S X q)|] ==> p ± q ≠ \<zero>" apply (frule ex_polyn_expr[of p], erule exE, erule conjE, frule ex_polyn_expr[of q], erule exE, erule conjE, rename_tac c d) apply (frule_tac c = c in pol_deg_eq_c_max[of p], assumption+, frule_tac c = d in pol_deg_eq_c_max[of q], assumption+, frule_tac c = c in coeff_max_bddTr, frule_tac c = d in coeff_max_bddTr) apply (frule_tac c = c and n = "c_max S c" in pol_coeff_le, assumption, frule_tac c = d and n = "c_max S d" in pol_coeff_le, assumption+) apply simp apply (subst polyn_c_max, assumption, subst polyn_c_max, assumption, subst polyn_expr_short, assumption+) apply (frule_tac c = d and k = "c_max S d" in polyn_expr_short, assumption+, simp, thin_tac "polyn_expr R X (c_max S d) d = polyn_expr R X (c_max S d) (c_max S d, snd d)", thin_tac "deg_n R S X (polyn_expr R X (fst c) c) = c_max S c", thin_tac "deg_n R S X (polyn_expr R X (fst d) d) = c_max S d") apply (subst polyn_add, assumption+, simp add:max_def) apply (rule contrapos_pp, simp+, frule_tac c = "(c_max S c, snd c)" and d = "(c_max S d, snd d)" in add_cf_pol_coeff, assumption+, frule_tac c1 = "add_cf S (c_max S c, snd c) (c_max S d, snd d)" and k1 = "c_max S d" in coeff_0_pol_0[THEN sym], simp add:add_cf_len max_def, simp, thin_tac "pol_coeff S (add_cf S (c_max S c, snd c) (c_max S d, snd d))", thin_tac "polyn_expr R X (c_max S d) (add_cf S (c_max S c, snd c) (c_max S d, snd d)) = \<zero>") apply (drule_tac a = "c_max S d" in forall_spec, simp, simp add:add_cf_def, frule_tac c = d and k = "fst d" in coeff_nonzero_polyn_nonzero, simp, simp, frule_tac c = d in coeff_max_nonzeroTr, assumption+, simp) done lemma (in PolynRg) polyn_deg_add1:"[|p ∈ carrier R; p ≠ \<zero>; q ∈ carrier R; q ≠ \<zero>; (deg_n R S X p) < (deg_n R S X q)|] ==> deg_n R S X (p ± q) = (deg_n R S X q)" apply (cut_tac subring) apply (frule less_deg_add_nonzero[of p q], assumption+) apply (frule ex_polyn_expr[of p], erule exE, erule conjE, frule ex_polyn_expr[of q], erule exE, erule conjE, rename_tac c d) apply (simp only:pol_deg_eq_c_max) apply (frule_tac c = c in coeff_max_bddTr, frule_tac c = d in coeff_max_bddTr) apply (frule_tac c = c and n = "c_max S c" in pol_coeff_le, assumption, frule_tac c = d and n = "c_max S d" in pol_coeff_le, assumption) apply (simp add:polyn_c_max) apply (frule_tac c = c and k = "c_max S c" in polyn_expr_short, simp, frule_tac c = d and k = "c_max S d" in polyn_expr_short, simp, simp) apply (frule_tac c = "(c_max S c, snd c)" and d = "(c_max S d, snd d)" in polyn_add1, assumption+, simp, thin_tac "polyn_expr R X (c_max S c) c = polyn_expr R X (c_max S c) (c_max S c, snd c)", thin_tac "polyn_expr R X (c_max S d) d = polyn_expr R X (c_max S d) (c_max S d, snd d)", thin_tac "polyn_expr R X (c_max S c) (c_max S c, snd c) ± polyn_expr R X (c_max S d) (c_max S d, snd d) = polyn_expr R X (max (c_max S c) (c_max S d)) (add_cf S (c_max S c, snd c) (c_max S d, snd d))") apply (frule_tac c = "(c_max S c, snd c)" and d = "(c_max S d, snd d)" in add_cf_pol_coeff, assumption+, simp add:max_def, rule_tac p = "polyn_expr R X (c_max S d) (add_cf S (c_max S c, snd c) (c_max S d, snd d))" and c = "add_cf S (c_max S c, snd c) (c_max S d, snd d)" and n = "c_max S d" in pol_deg_n) apply (rule_tac polyn_mem, simp, simp add:add_cf_len max_def, assumption, simp add:add_cf_len max_def, simp, subst add_cf_def, simp) apply (frule_tac c1 = "(c_max S d, snd d)" and k1 = "c_max S d" in coeff_0_pol_0[THEN sym], simp, simp, rule coeff_max_nonzeroTr, assumption+, erule exE, erule conjE, frule_tac i = j and j = "c_max S d" and k = "fst d" in le_trans, assumption+, blast) done lemma (in PolynRg) polyn_deg_add2:"[|p ∈ carrier R; p ≠ \<zero>; q ∈ carrier R; q ≠ \<zero>; p ± q ≠ \<zero>; (deg_n R S X p) = (deg_n R S X q)|] ==> deg_n R S X (p ± q) ≤ (deg_n R S X q)" apply (cut_tac subring) apply (frule ex_polyn_expr[of p], erule exE, erule conjE, frule ex_polyn_expr[of q], erule exE, erule conjE, rename_tac c d) apply (simp only:pol_deg_eq_c_max) apply (frule_tac c = c in coeff_max_bddTr, frule_tac c = d in coeff_max_bddTr) apply (frule_tac c = c and n = "c_max S c" in pol_coeff_le, assumption, frule_tac c = d and n = "c_max S d" in pol_coeff_le, assumption) apply (simp add:polyn_c_max) apply (frule_tac c = c and k = "c_max S c" in polyn_expr_short, simp, frule_tac c = d and k = "c_max S d" in polyn_expr_short, simp, simp, frule_tac c = "(c_max S d, snd c)" and d = "(c_max S d, snd d)" in polyn_add1, simp) apply (thin_tac "polyn_expr R X (c_max S d) d = polyn_expr R X (c_max S d) (c_max S d, snd d)", thin_tac "polyn_expr R X (c_max S d) c = polyn_expr R X (c_max S d) (c_max S d, snd c)", simp) apply (thin_tac "polyn_expr R X (c_max S d) (c_max S d, snd c) ± polyn_expr R X (c_max S d) (c_max S d, snd d) = polyn_expr R X (c_max S d) (add_cf S (c_max S d, snd c) (c_max S d, snd d))") apply (frule_tac c = "(c_max S d, snd c)" and d = "(c_max S d, snd d)" in add_cf_pol_coeff, assumption+) apply (cut_tac p = "polyn_expr R X (c_max S d) (add_cf S (c_max S d, snd c) (c_max S d, snd d))" and c = "add_cf S (c_max S d, snd c) (c_max S d, snd d)" in pol_deg_eq_c_max) apply (rule_tac polyn_mem, simp) apply (simp add:add_cf_len max_def, assumption, simp add:add_cf_len, simp) apply (thin_tac "deg_n R S X (polyn_expr R X (c_max S d) (add_cf S (c_max S d, snd c) (c_max S d, snd d))) = c_max S (add_cf S (c_max S d, snd c) (c_max S d, snd d))", thin_tac "polyn_expr R X (c_max S d) (add_cf S (c_max S d, snd c) (c_max S d, snd d)) ≠ \<zero>") apply (frule_tac c = "add_cf S (c_max S d, snd c) (c_max S d, snd d)" in coeff_max_bddTr) apply (simp add:add_cf_len) done lemma (in PolynRg) polyn_deg_add3:"[|p ∈ carrier R; p ≠ \<zero>; q ∈ carrier R; q ≠ \<zero>; p ± q ≠ \<zero>; (deg_n R S X p) ≤ n; (deg_n R S X q) ≤ n|] ==> deg_n R S X (p ± q) ≤ n" apply (case_tac "(deg_n R S X p) = (deg_n R S X q)", frule polyn_deg_add2[of "p" "q"], assumption+, simp) apply (cut_tac less_linear[of "deg_n R S X p" "deg_n R S X q"], simp, thin_tac "deg_n R S X p ≠ deg_n R S X q", erule disjE, simp add:polyn_deg_add1, cut_tac ring_is_ag, simp add:aGroup.ag_pOp_commute[of "R" "p" "q"], simp add:polyn_deg_add1) done lemma (in PolynRg) polyn_deg_add4:"[|p ∈ carrier R; q ∈ carrier R; (deg R S X p) ≤ (an n); (deg R S X q) ≤ (an n)|] ==> deg R S X (p ± q) ≤ (an n)" apply (cut_tac ring_is_ag) apply (case_tac "p = \<zero>R", simp add:aGroup.ag_l_zero) apply (case_tac "q = \<zero>R", simp add:aGroup.ag_r_zero) apply (case_tac "p ±R q = \<zero>R", simp add:deg_def) apply (frule aGroup.ag_pOp_closed[of R p q], assumption+) apply (simp add:deg_an) apply (simp only:ale_natle) apply (simp add:polyn_deg_add3) done lemma (in PolynRg) polyn_deg_add5:"[|p ∈ carrier R; q ∈ carrier R; (deg R S X p) ≤ a; (deg R S X q) ≤ a|] ==> deg R S X (p ± q) ≤ a" apply (case_tac "a = ∞", simp) apply (cut_tac ring_is_ag, case_tac "p = \<zero>R", simp add:aGroup.ag_l_zero[of R], case_tac "q = \<zero>R", simp add:aGroup.ag_r_zero, simp add:deg_an[of p]) apply (cut_tac an_nat_pos[of "deg_n R S X p"], frule ale_trans[of "0" "an (deg_n R S X p)" "a"], assumption+, subgoal_tac "an (deg_n R S X p) ≤ an (na a)", simp only:ale_natle[of "deg_n R S X p" "na a"]) apply (simp add:deg_an[of q]) apply (cut_tac an_nat_pos[of "deg_n R S X q"], frule ale_trans[of "0" "an (deg_n R S X q)" "a"], assumption+, subgoal_tac "an (deg_n R S X q) ≤ an (na a)", simp only:ale_natle[of "deg_n R S X q" "na a"]) apply (frule polyn_deg_add4[of p q "na a"], assumption+, simp add:an_na, simp add:deg_an, simp add:deg_an an_na, simp add:an_na) apply (simp add:deg_an an_na, simp add:deg_an an_na) done lemma (in PolynRg) lower_deg_part:"[|p ∈ carrier R; p ≠ \<zero>; 0 < deg_n R S X p|] ==> deg R S X (polyn_expr R X (deg_n R S X p - Suc 0)(SOME f. cf_sol R S X p f)) < deg R S X p" apply (case_tac "polyn_expr R X (deg_n R S X p - Suc 0) (SOME f. cf_sol R S X p f) = \<zero>R") apply (simp add:deg_def, cut_tac minf_le_any[of "an (deg_n R S X p)"]) apply (subst aless_le, simp, simp add:an_def) apply (rule not_sym, rule contrapos_pp, simp+) apply (simp add:deg_def, simp add:aless_natless) apply (frule pol_SOME_2[of p], erule conjE) apply (simp add:pol_deg_eq_c_max[of p "SOME c. cf_sol R S X p c"]) apply (frule_tac c = "SOME c. cf_sol R S X p c" in coeff_max_bddTr) apply (cut_tac p = "polyn_expr R X (c_max S (SOME c. cf_sol R S X p c) - Suc 0) (Eps (cf_sol R S X p))" and c = "(c_max S (SOME c. cf_sol R S X p c) - Suc 0, snd (SOME c. cf_sol R S X p c))" in pol_deg_eq_c_max) apply (rule polyn_mem, simp, arith) apply (rule pol_coeff_le, assumption, arith) apply (subst polyn_expr_short, arith, arith, simp) apply simp apply (cut_tac c = "(c_max S (SOME c. cf_sol R S X p c) - Suc 0, snd (SOME c. cf_sol R S X p c))" in coeff_max_bddTr, rule pol_coeff_le, assumption, arith, simp) done constdefs ldeg_p:: "[('a, 'm) Ring_scheme, ('a, 'm1) Ring_scheme, 'a, nat, 'a] => 'a" "ldeg_p R S X d p == polyn_expr R X d (scf_d R S X p (Suc d))" (** deg R S X p ≤ (Suc d) **) constdefs hdeg_p::"[('a, 'm) Ring_scheme, ('a, 'm1) Ring_scheme, 'a, nat, 'a] => 'a" "hdeg_p R S X d p == (snd (scf_d R S X p d) d) ·rR (X^R d)" (** deg R S X p ≤ d **) lemma (in PolynRg) ldeg_p_mem:"[|p ∈ carrier R; deg R S X p ≤ an (Suc d) |] ==> ldeg_p R S X d p ∈ carrier R" apply (frule scf_d_pol[of "p" "Suc d"], assumption+, erule conjE) apply (simp add:ldeg_p_def) apply (rule polyn_mem[of "scf_d R S X p (Suc d)" d], assumption+) apply simp done lemma (in PolynRg) ldeg_p_zero:"p = \<zero>R ==> ldeg_p R S X d p = \<zero>R" apply (subgoal_tac "deg R S X p ≤ an (Suc d)", subgoal_tac "p ∈ carrier R") apply (frule scf_d_pol[of "p" "Suc d"], assumption+, erule conjE) apply simp apply (frule coeff_0_pol_0[of "scf_d R S X \<zero> (Suc d)" "Suc d"], simp) apply (simp add:ldeg_p_def) apply (subst coeff_0_pol_0[THEN sym, of "scf_d R S X \<zero> (Suc d)"], assumption+, simp) apply (rule allI, rule impI, simp) apply (simp, simp add:ring_zero) apply (simp add:deg_def) done lemma (in PolynRg) hdeg_p_mem:"[|p ∈ carrier R; deg R S X p ≤ an (Suc d)|] ==> hdeg_p R S X (Suc d) p ∈ carrier R" apply (frule scf_d_pol[of p "Suc d"], assumption+, erule conjE) apply (simp only:hdeg_p_def, (erule conjE)+) apply (cut_tac Ring) apply (rule Ring.ring_tOp_closed[of "R"], assumption) apply (frule pol_coeff_mem[of "scf_d R S X p (Suc d)" "Suc d"], simp) apply (cut_tac subring) apply (simp add:Ring.mem_subring_mem_ring) apply (rule Ring.npClose[of "R"], assumption+) apply (rule X_mem_R) done (* ***************************************************************** constdefs ldeg_p:: "[('a, 'm) Ring_scheme, ('a, 'm1) Ring_scheme, 'a, 'a] => 'a" "ldeg_p R S X p == if p = \<zero>R then \<zero>R else if deg_n R S X p = 0 then p else polyn_expr R X (fst (s_cf R S X p) - Suc 0) (s_cf R S X p)" *) (** deg R S X p ≤ (Suc d), lower degree part **) (* constdefs hdeg_p::"[('a, 'm) Ring_scheme, ('a, 'm1) Ring_scheme, 'a,'a] => 'a" "hdeg_p R S X p == if p = \<zero>R then \<zero>R else (if (deg_n R S X p) = 0 then \<zero>R else (snd (s_cf R S X p) (fst (s_cf R S X p))) ·rR X^R (fst (s_cf R S X p)))" *) (** deg R S X p ≤ d, the highest degree term **) (* lemma (in PolynRg) ldeg_p_mem:"p ∈ carrier R ==> ldeg_p R S X p ∈ carrier R" apply (simp add:ldeg_p_def) apply (simp add:ring_zero) apply (rule impI, rule impI) apply (frule s_cf_pol_coeff[of p]) apply (simp add:polyn_mem) done lemma (in PolynRg) ldeg_p_zero:"ldeg_p R S X \<zero> = \<zero>" apply (simp add:ldeg_p_def) done lemma (in PolynRg) ldeg_p_zero1:"[|p ∈ carrier R; p ≠ \<zero>; deg_n R S X p = 0|] ==> ldeg_p R S X p = p" by (simp add:ldeg_p_def) lemma (in PolynRg) hdeg_p_mem:"p ∈ carrier R ==> hdeg_p R S X p ∈ carrier R" apply (cut_tac ring_is_ag) apply (cut_tac subring) apply (simp add:hdeg_p_def) apply (case_tac "deg_n R S X p = 0", simp add:aGroup.ag_inc_zero) apply simp apply (simp add:aGroup.ag_inc_zero) apply (rule impI) apply (frule s_cf_pol_coeff[of p]) apply (cut_tac X_mem_R, rule ring_tOp_closed) apply (simp add:pol_coeff_mem mem_subring_mem_ring) apply (rule npClose, assumption) done *) lemma (in PolynRg) hdeg_p_zero:"p = \<zero> ==> hdeg_p R S X (Suc d) p = \<zero>" apply (cut_tac X_mem_R) apply (subgoal_tac "deg R S X p ≤ an (Suc d)", subgoal_tac "p ∈ carrier R") apply (frule scf_d_pol[of p "Suc d"], assumption+, erule conjE) apply simp apply (frule coeff_0_pol_0[of "scf_d R S X \<zero> (Suc d)" "Suc d"], (erule conjE)+, simp) apply (simp only:hdeg_p_def) apply (rotate_tac -1, drule sym, simp del:npow_suc) apply (cut_tac subring, simp del:npow_suc add:Subring_zero_ring_zero, rule ring_times_0_x, rule npClose, assumption) apply (simp add:ring_zero) apply (simp add:deg_def) done lemma (in PolynRg) decompos_p:"[|p ∈ carrier R; deg R S X p ≤ an (Suc d)|] ==> p = (ldeg_p R S X d p) ± (hdeg_p R S X (Suc d) p)" apply (frule scf_d_pol[of p "Suc d"], assumption+, erule conjE) apply (cut_tac subring, (erule conjE)+) apply (cut_tac polyn_Suc[of d "scf_d R S X p (Suc d)"]) apply (simp only:ldeg_p_def hdeg_p_def) apply (rotate_tac -1, drule sym, simp del:npow_suc) apply (thin_tac "polyn_expr R X d (scf_d R S X p (Suc d)) ± snd (scf_d R S X p (Suc d)) (Suc d) ·r X^R (Suc d) = polyn_expr R X (Suc d) (Suc d, snd (scf_d R S X p (Suc d)))") apply (simp add:polyn_expr_split[of "Suc d" "scf_d R S X p (Suc d)"], simp) done lemma (in PolynRg) deg_ldeg_p:"[|p ∈ carrier R; deg R S X p ≤ an (Suc d)|] ==> deg R S X (ldeg_p R S X d p) ≤ an d" apply (cut_tac subring, frule subring_Ring) apply (case_tac "p = \<zero>R") apply (simp add:ldeg_p_zero, simp add:deg_def) apply (frule scf_d_pol[of p "Suc d"], assumption+, (erule conjE)+) apply (simp only:ldeg_p_def) apply (case_tac "polyn_expr R X d (scf_d R S X p (Suc d)) = \<zero>R") apply (simp add:deg_def) apply (simp add:deg_an) apply (simp add:ale_natle) apply (cut_tac pol_deg_le_n1[of "polyn_expr R X d (scf_d R S X p (Suc d))" "scf_d R S X p (Suc d)" d], simp add:deg_def ale_natle) apply (rule polyn_mem, assumption+, simp+) done lemma (in PolynRg) deg_minus_eq:"[|p ∈ carrier R; p ≠ \<zero>|] ==> deg_n R S X (-a p) = deg_n R S X p" apply (cut_tac subring, cut_tac ring_is_ag, frule subring_Ring) apply (cut_tac ring_is_ag) apply (frule s_cf_expr[of p], assumption, (erule conjE)+, frule polyn_minus_m_cf[of "s_cf R S X p" "fst (s_cf R S X p)"], simp, drule sym, simp) apply (frule_tac x = p in aGroup.ag_mOp_closed, assumption+, frule m_cf_pol_coeff [of "s_cf R S X p"], frule pol_deg_n[of "-a p" "m_cf S (s_cf R S X p)" "fst (s_cf R S X p)"], assumption, simp add:m_cf_len, assumption+) apply (simp add:m_cf_def, frule pol_coeff_mem[of "s_cf R S X p" "fst (s_cf R S X p)"], simp, frule Ring.ring_is_ag[of S]) apply (rule contrapos_pp, simp+) apply (frule aGroup.ag_inv_inv[THEN sym, of S "snd (s_cf R S X p) (fst (s_cf R S X p))"], assumption, simp add:aGroup.ag_inv_zero) apply (drule sym, simp, simp add:s_cf_deg) done lemma (in PolynRg) deg_minus_eq1:"p ∈ carrier R ==> deg R S X (-a p) = deg R S X p" apply (cut_tac ring_is_ag) apply (case_tac "p = \<zero>R") apply (simp add:aGroup.ag_inv_zero) apply (frule deg_minus_eq[of p], assumption+, frule aGroup.ag_inv_inj[of "R" "p" "\<zero>"], assumption, simp add:ring_zero, assumption, simp add:aGroup.ag_inv_zero) apply (frule aGroup.ag_mOp_closed[of R p], assumption, simp add:deg_an) done lemma (in PolynRg) ldeg_p_pOp:"[|p ∈ carrier R; q ∈ carrier R; deg R S X p ≤ an (Suc d); deg R S X q ≤ an (Suc d)|] ==> (ldeg_p R S X d p) ±R (ldeg_p R S X d q) = ldeg_p R S X d (p ±R q)" apply (simp add:ldeg_p_def, cut_tac ring_is_ag, cut_tac subring, frule subring_Ring[of S], frule scf_d_pol[of p "Suc d"], assumption+, frule scf_d_pol[of q "Suc d"], assumption+, (erule conjE)+) apply (frule polyn_add1[of "scf_d R S X p (Suc d)" "scf_d R S X q (Suc d)"], assumption+, rotate_tac -2, drule sym, frule aGroup.ag_pOp_closed[of "R" "p" "q"], assumption+, frule polyn_deg_add4 [of p q "Suc d"], assumption+, rotate_tac -5, drule sym) apply simp apply (rotate_tac 4, drule sym, simp) apply (rotate_tac -1, drule sym, frule scf_d_pol[of "p ± q" "Suc d"], assumption+, (erule conjE)+, frule box_equation[of "p ± q" "polyn_expr R X (Suc d) (add_cf S (scf_d R S X p (Suc d)) (scf_d R S X q (Suc d)))" "polyn_expr R X (Suc d) (scf_d R S X (p ± q) (Suc d))"], assumption+, thin_tac "p ± q = polyn_expr R X (Suc d) (scf_d R S X (p ± q) (Suc d))") apply (frule add_cf_pol_coeff[of "scf_d R S X p (Suc d)" "scf_d R S X q (Suc d)"], assumption+) apply (frule pol_expr_unique2[of "add_cf S (scf_d R S X p (Suc d)) (scf_d R S X q (Suc d))" "scf_d R S X (p ± q) (Suc d)"], assumption+) apply (subst add_cf_len[of "scf_d R S X p (Suc d)" "scf_d R S X q (Suc d)"], assumption+) apply (thin_tac "polyn_expr R X (Suc d) (scf_d R S X p (Suc d)) = p", thin_tac "polyn_expr R X (Suc d) (scf_d R S X q (Suc d)) = q", thin_tac "p ± q = polyn_expr R X (Suc d) (add_cf S (scf_d R S X p (Suc d)) (scf_d R S X q (Suc d)))", thin_tac "polyn_expr R X (Suc d) (add_cf S (scf_d R S X p (Suc d)) (scf_d R S X q (Suc d))) = polyn_expr R X (Suc d) (scf_d R S X (p ± q) (Suc d))") apply simp apply (thin_tac "polyn_expr R X (Suc d) (scf_d R S X p (Suc d)) = p", thin_tac "polyn_expr R X (Suc d) (scf_d R S X q (Suc d)) = q", thin_tac "p ± q = polyn_expr R X (Suc d) (add_cf S (scf_d R S X p (Suc d)) (scf_d R S X q (Suc d)))") apply (simp add:add_cf_len, thin_tac "polyn_expr R X (Suc d) (add_cf S (scf_d R S X p (Suc d)) (scf_d R S X q (Suc d))) = polyn_expr R X (Suc d) (scf_d R S X (p ± q) (Suc d))") apply (subst polyn_expr_short[of "scf_d R S X p (Suc d)" d], assumption, simp) apply (subst polyn_expr_short[of "scf_d R S X q (Suc d)" d], assumption, simp) thm polyn_add_n apply (subst polyn_add_n[of d "snd (scf_d R S X p (Suc d))" "snd (scf_d R S X q (Suc d))"]) apply (simp add:split_pol_coeff, simp add:split_pol_coeff, subst polyn_expr_def) apply (rule aGroup.nsum_eq, assumption+, rule allI, rule impI, frule_tac j = j in pol_coeff_mem[of "scf_d R S X p (Suc d)"], simp, frule_tac j = j in pol_coeff_mem[of "scf_d R S X q (Suc d)"], simp, cut_tac Ring, rule Ring.ring_tOp_closed, assumption+, rule Ring.mem_subring_mem_ring[of R S], assumption+, frule Ring.ring_is_ag[of S], rule aGroup.ag_pOp_closed[of S], assumption+, rule Ring.npClose, assumption, simp add:X_mem_R) apply (rule allI, rule impI, frule_tac j = j in pol_coeff_mem[of "scf_d R S X (p ± q) (Suc d)"], simp, cut_tac Ring, subst Ring.ring_tOp_closed, assumption, rule Ring.mem_subring_mem_ring[of R S], assumption+, rule Ring.npClose, assumption, simp add:X_mem_R, simp) apply (rule allI, rule impI, drule_tac a = j in forall_spec, simp, thin_tac " pol_coeff S (add_cf S (scf_d R S X p (Suc d)) (scf_d R S X q (Suc d)))") apply (simp add:add_cf_def) done lemma (in PolynRg) hdeg_p_pOp:"[|p ∈ carrier R; q ∈ carrier R; deg R S X p ≤ an (Suc d); deg R S X q ≤ an (Suc d)|] ==> (hdeg_p R S X (Suc d) p) ± (hdeg_p R S X (Suc d) q) = hdeg_p R S X (Suc d) (p ± q)" apply (cut_tac Ring, frule Ring.ring_is_ag[of "R"]) apply (cut_tac subring, frule subring_Ring[of S]) apply (frule scf_d_pol[of p "Suc d"], assumption+, frule scf_d_pol[of q "Suc d"], assumption+, (erule conjE)+) apply (frule polyn_add1[of "scf_d R S X p (Suc d)" "scf_d R S X q (Suc d)"], assumption+, rotate_tac -2, drule sym, frule aGroup.ag_pOp_closed[of "R" "p" "q"], assumption+, frule polyn_deg_add4 [of p q "Suc d"], assumption+, rotate_tac -5, drule sym) apply simp apply (rotate_tac -13, drule sym, simp) apply (rotate_tac -1, drule sym) apply (frule scf_d_pol[of "p ± q" "Suc d"], assumption+, (erule conjE)+) apply (drule box_equation[of "p ± q" "polyn_expr R X (Suc d) (add_cf S (scf_d R S X p (Suc d)) (scf_d R S X q (Suc d)))" "polyn_expr R X (Suc d) (scf_d R S X (p ± q) (Suc d))"], assumption+) apply ( thin_tac "p ± q = polyn_expr R X (Suc d) (scf_d R S X (p ± q) (Suc d))") apply (frule add_cf_pol_coeff[of "scf_d R S X p (Suc d)" "scf_d R S X q (Suc d)"], assumption+) apply (cut_tac pol_expr_unique2[of "add_cf S (scf_d R S X p (Suc d)) (scf_d R S X q (Suc d))" "scf_d R S X (p ± q) (Suc d)"], simp add:add_cf_len) apply (drule_tac a = "Suc d" in forall_spec, simp) apply (simp del:npow_suc add:hdeg_p_def) apply (rotate_tac -1, drule sym, simp del:npow_suc) apply (subst add_cf_def, simp del:npow_suc) apply (thin_tac "polyn_expr R X (Suc d) (scf_d R S X p (Suc d)) = p", thin_tac "polyn_expr R X (Suc d) (scf_d R S X q (Suc d)) = q", thin_tac "polyn_expr R X (Suc d) (add_cf S (scf_d R S X p (Suc d)) (scf_d R S X q (Suc d))) = polyn_expr R X (Suc d) (scf_d R S X (p ± q) (Suc d))", thin_tac "pol_coeff S (add_cf S (scf_d R S X p (Suc d)) (scf_d R S X q (Suc d)))", thin_tac "snd (scf_d R S X (p ± q) (Suc d)) (Suc d) = snd (add_cf S (scf_d R S X p (Suc d)) (scf_d R S X q (Suc d))) (Suc d)") apply (frule pol_coeff_mem[of "scf_d R S X p (Suc d)" "Suc d"], simp del:npow_suc, frule pol_coeff_mem[of "scf_d R S X q (Suc d)" "Suc d"], simp del:npow_suc) apply (simp del:npow_suc add:Subring_pOp_ring_pOp) apply (frule mem_subring_mem_ring[of S "snd (scf_d R S X p (Suc d)) (Suc d)"], assumption, frule mem_subring_mem_ring[of S "snd (scf_d R S X q (Suc d)) (Suc d)"], assumption, cut_tac X_mem_R, frule Ring.npClose[of R X "Suc d"], assumption+) apply (subst Ring.ring_distrib2[THEN sym], assumption+, simp) apply (simp add:add_cf_pol_coeff, simp) apply (simp add:add_cf_len) done lemma (in PolynRg) ldeg_p_mOp:"[|p ∈ carrier R; deg R S X p ≤ an (Suc d)|] ==> -a (ldeg_p R S X d p) = ldeg_p R S X d (-a p)" apply (cut_tac Ring, frule Ring.ring_is_ag[of "R"], cut_tac subring, frule subring_Ring[of S], frule scf_d_pol[of p "Suc d"], assumption+, (erule conjE)+, frule aGroup.ag_mOp_closed[of R p], assumption, frule scf_d_pol[of "-a p" "Suc d"]) apply (simp add:deg_minus_eq1, (erule conjE)+) apply (frule polyn_minus[of "scf_d R S X p (Suc d)" "Suc d"], simp) apply (drule box_equation[of "-a p" "polyn_expr R X (Suc d) (scf_d R S X (-a p) (Suc d))" "polyn_expr R X (Suc d) (fst (scf_d R S X p (Suc d)), λj. -aS snd (scf_d R S X p (Suc d)) j)"]) apply (rotate_tac 8, drule sym, simp, thin_tac "-a polyn_expr R X (Suc d) (scf_d R S X p (Suc d)) = polyn_expr R X (Suc d) (fst (scf_d R S X p (Suc d)), λj. -aS snd (scf_d R S X p (Suc d)) j)") apply simp apply (frule pol_expr_unique2[of "scf_d R S X (-a p) (Suc d)" "(Suc d, λj. -aS snd (scf_d R S X p (Suc d)) j)"]) apply (subst pol_coeff_def, rule allI, rule impI, simp) apply (frule_tac j = j in pol_coeff_mem[of "scf_d R S X p (Suc d)"], simp, frule Ring.ring_is_ag[of S], rule aGroup.ag_mOp_closed[of S], assumption+, simp) apply simp apply (simp add:ldeg_p_def) apply (subst polyn_minus[of "scf_d R S X p (Suc d)" d], assumption, simp, simp) apply (subst polyn_expr_short[of "(Suc d, λj. -aS snd (scf_d R S X p (Suc d)) j)" d]) apply (subst pol_coeff_def, rule allI, rule impI, simp, frule_tac j = j in pol_coeff_mem[of "scf_d R S X p (Suc d)"], simp, frule Ring.ring_is_ag[of S], rule aGroup.ag_mOp_closed[of S], assumption+, simp) apply (subst polyn_expr_short[of "scf_d R S X (-a p) (Suc d)" d], assumption, simp) apply (cut_tac pol_expr_unique2[of "(d, snd (Suc d, λj. -aS snd (scf_d R S X p (Suc d)) j))" "(d, snd (scf_d R S X (-a p) (Suc d)))"]) apply (thin_tac "p = polyn_expr R X (Suc d) (scf_d R S X p (Suc d))", thin_tac "polyn_expr R X (Suc d) (scf_d R S X (-a p) (Suc d)) = polyn_expr R X (Suc d) (Suc d, λj. -aS snd (scf_d R S X p (Suc d)) j)", simp) apply (subst pol_coeff_def, rule allI, rule impI, simp, frule Ring.ring_is_ag[of S], rule aGroup.ag_mOp_closed, assumption, simp add:pol_coeff_mem) apply (subst pol_coeff_def, rule allI, rule impI, simp, frule Ring.ring_is_ag[of S], rule aGroup.ag_mOp_closed, assumption, simp add:pol_coeff_mem) apply simp done lemma (in PolynRg) hdeg_p_mOp:"[|p ∈ carrier R;deg R S X p ≤ an (Suc d)|] ==> -a (hdeg_p R S X (Suc d) p) = hdeg_p R S X (Suc d) (-a p)" apply (cut_tac Ring, frule Ring.ring_is_ag[of "R"], cut_tac subring, frule subring_Ring[of S], frule scf_d_pol[of p "Suc d"], assumption+, (erule conjE)+, frule aGroup.ag_mOp_closed[of R p], assumption) apply ( frule scf_d_pol[of "-a p" "Suc d"]) apply (simp add:deg_minus_eq1, (erule conjE)+) apply (frule polyn_minus[of "scf_d R S X p (Suc d)" "Suc d"], simp) apply (drule box_equation[of "-a p" "polyn_expr R X (Suc d) (scf_d R S X (-a p) (Suc d))" "polyn_expr R X (Suc d) (fst (scf_d R S X p (Suc d)), λj. -aS snd (scf_d R S X p (Suc d)) j)"]) apply (rotate_tac 8, drule sym, simp, thin_tac "-a polyn_expr R X (Suc d) (scf_d R S X p (Suc d)) = polyn_expr R X (Suc d) (fst (scf_d R S X p (Suc d)), λj. -aS snd (scf_d R S X p (Suc d)) j)") apply simp apply (frule pol_expr_unique2[of "scf_d R S X (-a p) (Suc d)" "(Suc d, λj. -aS snd (scf_d R S X p (Suc d)) j)"]) apply (subst pol_coeff_def, rule allI, rule impI, simp) apply (frule_tac j = j in pol_coeff_mem[of "scf_d R S X p (Suc d)"], simp, frule Ring.ring_is_ag[of S], rule aGroup.ag_mOp_closed[of S], assumption+, simp) apply simp apply (drule_tac a = "Suc d" in forall_spec, simp) apply (simp del:npow_suc add:hdeg_p_def) apply (thin_tac "p = polyn_expr R X (Suc d) (scf_d R S X p (Suc d))", thin_tac "polyn_expr R X (Suc d) (scf_d R S X (-a p) (Suc d)) = polyn_expr R X (Suc d) (Suc d, λj. -aS snd (scf_d R S X p (Suc d)) j)", thin_tac "snd (scf_d R S X (-a p) (Suc d)) (Suc d) = -aS snd (scf_d R S X p (Suc d)) (Suc d)") apply (frule pol_coeff_mem[of "scf_d R S X p (Suc d)" "Suc d"], simp, frule mem_subring_mem_ring[of S "snd (scf_d R S X p (Suc d)) (Suc d)"], assumption+, frule Ring.npClose[of R X "Suc d"], simp add:X_mem_R) apply (subst Ring.ring_inv1_1[of "R"], assumption+) apply (simp del:npow_suc add:Subring_minus_ring_minus) done subsection "multiplication of polynomials" lemma (in PolynRg) deg_mult_pols:"[|Idomain S; p ∈ carrier R; p ≠ \<zero>; q ∈ carrier R; q ≠ \<zero> |] ==> p ·r q ≠ \<zero> ∧ deg_n R S X (p ·r q) = deg_n R S X p + deg_n R S X q" apply (frule Idomain.idom_is_ring[of "S"], frule_tac x = p and y = q in ring_tOp_closed, assumption+) apply (frule s_cf_expr[of p], assumption, frule s_cf_expr[of q], assumption, (erule conjE)+) apply (frule_tac c = "s_cf R S X p" and d = "s_cf R S X q" in polyn_expr_tOp_c, assumption, erule exE, (erule conjE)+) apply (drule sym, drule sym, simp, thin_tac "polyn_expr R X (fst (s_cf R S X q)) (s_cf R S X q) = q", thin_tac "polyn_expr R X (fst (s_cf R S X p)) (s_cf R S X p) = p") apply (rotate_tac -1, drule sym, frule ring_tOp_closed[of p q], assumption+, frule pol_coeff_mem[of "s_cf R S X p" "fst (s_cf R S X p)"], simp, frule pol_coeff_mem[of "s_cf R S X q" "fst (s_cf R S X q)"], simp, frule_tac x = "snd (s_cf R S X p) (fst (s_cf R S X p))" and y = "snd (s_cf R S X q) (fst (s_cf R S X q))" in Idomain.idom_tOp_nonzeros[of "S"], assumption+, frule_tac c = e in coeff_nonzero_polyn_nonzero[ of _ "deg_n R S X p + deg_n R S X q"], simp) apply (simp add:s_cf_deg, simp add:s_cf_deg) apply (cut_tac n = "fst (s_cf R S X p) + fst (s_cf R S X q)" in le_refl) apply (subgoal_tac "∃j≤fst (s_cf R S X p) + fst (s_cf R S X q). snd e j ≠ \<zero>S", simp) apply (cut_tac c = e in pol_deg_n[of "p ·r q" _ "fst (s_cf R S X p) + fst (s_cf R S X q)"], simp+) apply (thin_tac "(polyn_expr R X (fst (s_cf R S X p) + fst (s_cf R S X q)) e ≠ \<zero>) = (∃j≤fst (s_cf R S X p) + fst (s_cf R S X q). snd e j ≠ \<zero>S)", thin_tac "p ·r q = polyn_expr R X (fst (s_cf R S X p) + fst (s_cf R S X q)) e", thin_tac "polyn_expr R X (fst (s_cf R S X p) + fst (s_cf R S X q)) e ∈ carrier R", thin_tac "snd (s_cf R S X p) (fst (s_cf R S X p)) ∈ carrier S", thin_tac "snd (s_cf R S X q) (fst (s_cf R S X q)) ∈ carrier S") apply (drule sym, drule sym, simp) apply (cut_tac n = "fst e" in le_refl, blast) done lemma (in PolynRg) deg_mult_pols1:"[|Idomain S; p ∈ carrier R; q ∈ carrier R|] ==> deg R S X (p ·r q) = deg R S X p + deg R S X q" apply (case_tac "p = \<zero>R", simp add:ring_times_0_x, simp add:deg_def, rule impI) apply (simp add:an_def) apply (case_tac "q = \<zero>R", simp add:ring_times_x_0, simp add:deg_def) apply (simp add:an_def) apply (frule deg_mult_pols[of p q], assumption+, erule conjE) apply (frule Idomain.idom_is_ring[of "S"]) apply (frule ring_tOp_closed[of p q], assumption+) apply (simp add:deg_an an_def a_zpz) done lemma (in PolynRg) const_times_polyn:"[|Idomain S; c ∈ carrier S; c ≠ \<zero>S; p ∈ carrier R; p ≠ \<zero>|] ==> (c ·r p) ≠ \<zero> ∧ deg_n R S X (c ·r p) = deg_n R S X p" apply (frule Idomain.idom_is_ring[of "S"], cut_tac subring, frule mem_subring_mem_ring[of S c], assumption+, simp add:Subring_zero_ring_zero) apply (frule deg_mult_pols[of c p], assumption+, erule conjE, simp, simp add:pol_of_deg0[THEN sym, of "c"]) done (*lemma (in PolynRg) deg_minus_eq:"[|ring R; integral_domain S; polyn_ring R S X; p ∈ carrier R; p ≠ 0R|] ==> deg_n R S X (-R p) = deg_n R S X p" *) lemma (in PolynRg) p_times_monomial_nonzero:"[|p ∈ carrier R; p ≠ \<zero>|] ==> (X^R j) ·r p ≠ \<zero>" apply (cut_tac subring, frule subring_Ring) apply (frule s_cf_expr[of p], assumption+, (erule conjE)+) apply (frule low_deg_terms_zero1[THEN sym, of "s_cf R S X p" j]) apply (drule sym, simp, thin_tac "X^R j ·r p = polyn_expr R X (fst (s_cf R S X p) + j) (ext_cf S j (s_cf R S X p))", thin_tac "polyn_expr R X (fst (s_cf R S X p)) (s_cf R S X p) = p") apply (frule ext_cf_pol_coeff[of "s_cf R S X p" j]) apply(frule coeff_nonzero_polyn_nonzero[of "ext_cf S j (s_cf R S X p)" "fst (ext_cf S j (s_cf R S X p))"], simp) apply (simp add:ext_cf_len add_commute[of j], thin_tac "(polyn_expr R X (fst (s_cf R S X p) + j) (ext_cf S j (s_cf R S X p)) ≠ \<zero>) = (∃ja≤fst (s_cf R S X p) + j. snd (ext_cf S j (s_cf R S X p)) ja ≠ \<zero>S)") apply (cut_tac ext_cf_hi[of "s_cf R S X p" j], simp, thin_tac "snd (s_cf R S X p) (fst (s_cf R S X p)) = snd (ext_cf S j (s_cf R S X p)) (j + fst (s_cf R S X p))", simp add:add_commute[of _ j]) apply (cut_tac n = "j + fst (s_cf R S X p)" in le_refl, blast) apply assumption done lemma (in PolynRg) p_times_monomial_nonzero1:"[|Idomain S; p ∈ carrier R; p ≠ \<zero>; c ∈ carrier S; c ≠ \<zero>S|] ==>(c ·r (X^R j)) ·r p ≠ \<zero>" apply (frule Idomain.idom_is_ring[of "S"], cut_tac subring, cut_tac X_mem_R , frule mem_subring_mem_ring[of S c], assumption+, frule npClose[of X j]) apply (simp add:ring_tOp_commute[of c], simp add:ring_tOp_assoc, frule const_times_polyn[of c p], assumption+, erule conjE, frule ring_tOp_closed[of c p], assumption+, simp add:p_times_monomial_nonzero[of "c ·r p"]) done lemma (in PolynRg) polyn_ring_integral:"Idomain S = Idomain R" apply (cut_tac subring, frule subring_Ring) apply (rule iffI) apply (subst Idomain_def) apply (cut_tac Ring, simp) apply (rule Idomain_axioms.intro, rule contrapos_pp, simp+, erule conjE, frule_tac p = a and q = b in deg_mult_pols, assumption+, erule conjE, simp) apply (subst Idomain_def) apply (cut_tac Ring, simp) apply (rule Idomain_axioms.intro, rule contrapos_pp, simp+, erule conjE) apply (simp add:Subring_tOp_ring_tOp) apply (frule_tac x = a in mem_subring_mem_ring[of S], assumption, frule_tac x = b in mem_subring_mem_ring[of S], assumption) apply (frule_tac a = a and b = b in Idomain.idom[of R], assumption+) apply (simp add:Subring_zero_ring_zero) apply (erule disjE, simp add:Subring_zero_ring_zero) apply (simp add:Subring_zero_ring_zero) done lemma (in PolynRg) deg_to_X_d:"Idomain S ==> deg_n R S X (X^R d) = d" apply (cut_tac subring, frule subring_Ring, cut_tac polyn_ring_S_nonzero, cut_tac X_mem_R, cut_tac polyn_ring_X_nonzero, cut_tac polyn_ring_integral) apply (induct_tac d) apply (cut_tac ring_one, simp add:Subring_one_ring_one[THEN sym], simp add:Subring_zero_ring_zero) apply (subst pol_of_deg0[of "1rS"], assumption+, simp add:Ring.ring_one[of S]) apply simp apply (subst deg_mult_pols, assumption+, simp add:npClose, rule Idomain.idom_potent_nonzero, assumption+) apply (simp add:deg_n_of_X) done subsection "degree with value in aug_minf" lemma (in PolynRg) nonzero_deg_pos:"[|p ∈ carrier R; p ≠ \<zero>|] ==> 0 ≤ deg R S X p" by (simp add:deg_def) lemma (in PolynRg) deg_minf_pol_0:"p ∈ carrier R ==> (deg R S X p = -∞) = (p = \<zero>)" apply (rule iffI) apply (rule contrapos_pp, simp+, frule nonzero_deg_pos[of p], assumption+, simp add:deg_def an_def) apply (simp add:deg_def) done lemma (in PolynRg) pol_nonzero:"p ∈ carrier R ==> (0 ≤ deg R S X p) = (p ≠ \<zero>)" apply (rule iffI) apply (rule contrapos_pp, simp+, simp add:deg_def, cut_tac minf_le_any[of "0"], frule ale_antisym[of "0" "-∞"], assumption+, simp only:an_0[THEN sym], simp only:an_def, simp del:int_0) apply (simp add:deg_def) done lemma (in PolynRg) minus_deg_in_aug_minf:"[|p ∈ carrier R; p ≠ \<zero>|] ==> - (deg R S X p) ∈ Z-∞" apply (frule deg_in_aug_minf[of p], frule pol_nonzero[THEN sym, of p], simp add:aug_minf_def, rule contrapos_pp, simp+, cut_tac a_minus_minus[of "deg R S X p"], simp) apply (thin_tac "- deg R S X p = ∞", frule sym, thin_tac "- ∞ = deg R S X p", frule deg_minf_pol_0[of p], simp) done lemma (in PolynRg) deg_of_X:"deg R S X X = 1" (* the degree of the polyn. X *) apply (cut_tac X_mem_R, cut_tac polyn_ring_X_nonzero, cut_tac subring) apply (simp add:deg_def, simp only:an_1[THEN sym], rule nat_eq_an_eq, simp add:deg_n_of_X) done lemma (in PolynRg) pol_deg_0:"[|p ∈ carrier R; p ≠ \<zero>|] ==> (deg R S X p = 0) = (p ∈ carrier S)" apply (simp add:deg_def, simp only:an_0[THEN sym], rule iffI, frule an_inj[of "deg_n R S X p" "0"], simp, simp add:pol_of_deg0, rule nat_eq_an_eq, simp add:pol_of_deg0[of p]) done lemma (in PolynRg) deg_of_X2n:"Idomain S ==> deg R S X (X^R n) = an n" apply (frule Idomain.idom_is_ring[of "S"]) apply (cut_tac subring, cut_tac X_mem_R, cut_tac polyn_ring_X_nonzero, cut_tac polyn_ring_integral, simp) apply (induct_tac n) apply simp apply (simp add:Subring_one_ring_one[THEN sym, of "S"]) apply (subst pol_deg_0[of "1rS"]) apply (simp add:Subring_one_ring_one, simp add:ring_one) apply (simp add:Subring_one_ring_one[of S] polyn_ring_nonzero) apply (simp add:Ring.ring_one[of S]) apply (frule_tac n = n in npClose[of X]) apply (simp add:deg_def) apply (simp add:Idomain.idom_potent_nonzero, frule_tac n = "Suc n" in Idomain.idom_potent_nonzero[of R X], assumption+, simp) apply (rule nat_eq_an_eq) apply (frule_tac n = n in Idomain.idom_potent_nonzero[of R X], assumption+) apply (frule_tac n = "deg_n R S X (X^R n)" and m = n in an_inj, thin_tac "an (deg_n R S X (X^R n)) = an n") apply (cut_tac deg_of_X) apply (simp add:deg_def, simp only:an_1[THEN sym]) apply (frule_tac n = "deg_n R S X X" and m = 1 in an_inj) apply (simp add:deg_mult_pols) done lemma (in PolynRg) add_pols_nonzero:"[|p ∈ carrier R; q ∈ carrier R; (deg R S X p) ≠ (deg R S X q)|] ==> p ± q ≠ \<zero>" apply (cut_tac ring_is_ag, cut_tac subring, frule subring_Ring) apply (case_tac "p = \<zero>R", simp add:deg_minf_pol_0[THEN sym], simp add:aGroup.ag_l_zero, rule contrapos_pp, simp+, case_tac "q = \<zero>R", simp add:aGroup.ag_r_zero) apply (simp add:deg_def, simp only:aneq_natneq[of "deg_n R S X p" "deg_n R S X q"], cut_tac less_linear[of "deg_n R S X p" "deg_n R S X q"], simp, erule disjE, rule less_deg_add_nonzero[of p q], assumption+, frule less_deg_add_nonzero[of q p], assumption+, simp add:aGroup.ag_pOp_commute) done lemma (in PolynRg) deg_pols_add1:"[|p ∈ carrier R; q ∈ carrier R; (deg R S X p) < (deg R S X q)|] ==> deg R S X (p ± q) = deg R S X q" apply (cut_tac ring_is_ag, case_tac "p = \<zero>R", simp add:deg_def aGroup.ag_l_zero, case_tac "q = \<zero>R", simp add:deg_def) apply (rule impI) apply (simp add:an_def z_neq_minf) apply (fold an_def, frule aless_imp_le[of "an (deg_n R S X p)" " - ∞"], cut_tac minf_le_any[of "an (deg_n R S X p)"], frule ale_antisym[of "an (deg_n R S X p)" "- ∞"], assumption+, simp add:an_neq_minf) apply (simp add:deg_def, simp add:aless_nat_less, frule less_deg_add_nonzero[of p q], assumption+, simp, frule polyn_deg_add1[of p q], assumption+, simp) done lemma (in PolynRg) deg_pols_add2:"[|p ∈ carrier R; q ∈ carrier R; (deg R S X p) = (deg R S X q)|] ==> deg R S X (p ± q) ≤ (deg R S X q)" apply (cut_tac ring_is_ag, cut_tac subring, frule subring_Ring) apply (case_tac "p = \<zero>R", simp add:aGroup.ag_l_zero) apply (case_tac "q = \<zero>R", simp add:aGroup.ag_r_zero) apply (simp add:deg_def, frule an_inj[of "deg_n R S X p" "deg_n R S X q"], simp, rule impI, subst ale_natle, simp add:polyn_deg_add2) done lemma (in PolynRg) deg_pols_add3:"[|p ∈ carrier R; q ∈ carrier R; (deg R S X p) ≤ an n; (deg R S X q) ≤ an n|] ==> deg R S X (p ± q) ≤ an n" apply (case_tac "(deg R S X p) = (deg R S X q)", frule deg_pols_add2[of p q], assumption+, simp) apply (cut_tac aless_linear[of "deg R S X p" "deg R S X q"], simp, thin_tac "deg R S X p ≠ deg R S X q", erule disjE, simp add:deg_pols_add1, cut_tac ring_is_ag, simp add:aGroup.ag_pOp_commute[of "R" "p" "q"], simp add:deg_pols_add1) done lemma (in PolynRg) const_times_polyn1:"[|Idomain S; p∈ carrier R; c ∈ carrier S; c ≠ \<zero>S|] ==> deg R S X (c ·r p) = deg R S X p" apply (frule Idomain.idom_is_ring, cut_tac subring, frule mem_subring_mem_ring[of S c], assumption, simp add:Subring_zero_ring_zero) apply (subst deg_mult_pols1[of c p], assumption+, simp add: pol_deg_0[THEN sym, of "c"], simp add:aadd_0_l) done section "15. homomorphism of polynomial rings" constdefs cf_h::" ('a => 'b) => nat × (nat => 'a) => nat × (nat => 'b)" "cf_h f == λc. (fst c, cmp f (snd c))" constdefs polyn_Hom::"[('a, 'm) Ring_scheme, ('a, 'm1) Ring_scheme, 'a, ('b, 'n) Ring_scheme, ('b, 'n1) Ring_scheme, 'b] => ('a => 'b) set" ("(pHom _ _ _, _ _ _)" [67,67,67,67,67,68]67) "pHom R S X, A B Y == {f. f ∈ rHom R A ∧ f`(carrier S) ⊆ carrier B ∧ f X = Y}" (* Hom from a polynomial ring to a polynomial ring *) constdefs erh::"[('a, 'm) Ring_scheme, ('a, 'm1) Ring_scheme, 'a, ('b, 'n) Ring_scheme, ('b, 'n1) Ring_scheme, 'b, 'a => 'b, nat, nat × (nat => 'a)] => 'b" "erh R S X A B Y f n c == polyn_expr A Y n (cf_h f c)" (* extension of a ring hom. *) lemma (in PolynRg) cf_h_len:"[|PolynRg A B Y; f ∈ rHom S B; pol_coeff S c|] ==> fst (cf_h f c) = fst c" by (simp add:cf_h_def) lemma (in PolynRg) cf_h_coeff:"[|PolynRg A B Y; f ∈ rHom S B; pol_coeff S c|] ==> pol_coeff B (cf_h f c)" apply (subst pol_coeff_def) apply (rule allI, rule impI, simp add:cf_h_len cf_h_def) apply (frule_tac j = j in pol_coeff_mem[of c], assumption) apply (simp add:cmp_def rHom_mem) done lemma (in PolynRg) cf_h_cmp:"[|PolynRg A B Y; pol_coeff S (n, f); h ∈ rHom S B; j ≤ n|] ==> (snd (cf_h h (n, f))) j = (cmp h f) j" by (simp add:cf_h_def) lemma (in PolynRg) cf_h_special_cf:"[|PolynRg A B Y; h ∈ rHom S B|] ==> polyn_expr A Y (Suc 0) (cf_h h (ext_cf S (Suc 0) (C0 S))) = polyn_expr A Y (Suc 0) (ext_cf B (Suc 0) (C0 B))" apply (cut_tac subring, frule subring_Ring, frule PolynRg.is_Ring[of A B Y], frule PolynRg.subring[of A B Y], frule Ring.subring_Ring[of A B], assumption) apply (cut_tac special_cf_pol_coeff, frule ext_cf_pol_coeff[of "C0 S" "Suc 0"], frule cf_h_coeff[of A B Y h "ext_cf S (Suc 0) (C0 S)"], assumption+) apply (frule PolynRg.special_cf_pol_coeff, frule PolynRg.ext_cf_pol_coeff[of A B Y "C0 B" "Suc 0"], assumption) apply (frule PolynRg.pol_expr_unique2[of A B Y "cf_h h (ext_cf S (Suc 0) (C0 S))" "ext_cf B (Suc 0) (C0 B)"], assumption+, simp add:cf_h_len PolynRg.ext_cf_len, simp add:ext_cf_len special_cf_len PolynRg.special_cf_len, simp add:cf_h_len PolynRg.ext_cf_len, simp add:ext_cf_len special_cf_len PolynRg.special_cf_len, thin_tac "(polyn_expr A Y (Suc 0) (cf_h h (ext_cf S (Suc 0) (C0 S))) = polyn_expr A Y (Suc 0) (ext_cf B (Suc 0) (C0 B))) = (∀j≤Suc 0. snd (cf_h h (ext_cf S (Suc 0) (C0 S))) j = snd (ext_cf B (Suc 0) (C0 B)) j)", thin_tac "pol_coeff S (C0 S)", thin_tac "pol_coeff S (ext_cf S (Suc 0) (C0 S))", thin_tac "pol_coeff B (cf_h h (ext_cf S (Suc 0) (C0 S)))") apply (rule allI, rule impI) apply (case_tac "j = 0", simp add:cf_h_def cmp_def ext_cf_def sliden_def) apply (simp add:rHom_0_0) apply (simp) apply (frule_tac n = j in less_Suc_le1[of 0], frule_tac m = j and n = "Suc 0" in le_anti_sym, assumption+, thin_tac "j ≤ Suc 0", thin_tac "Suc 0 ≤ j", simp add:cf_h_def cmp_def ext_cf_def sliden_def special_cf_def, simp add:rHom_one) done lemma (in PolynRg) polyn_Hom_coeff_to_coeff: "[|PolynRg A B Y; f ∈ pHom R S X, A B Y; pol_coeff S c|] ==> pol_coeff B (cf_h f c)" apply (subst pol_coeff_def) apply (rule allI, rule impI, simp add:cf_h_len cf_h_def) apply (frule_tac j = j in pol_coeff_mem[of c], assumption) apply (simp add:cmp_def polyn_Hom_def, (erule conjE)+) apply (simp add:image_def) apply (rule subsetD[of "{y. ∃x∈carrier S. y = f x}" "carrier B"], assumption, simp) apply blast done (* old name is cmp_pol_coeff *) lemma (in PolynRg) cf_h_len1:"[|PolynRg A B Y; h ∈ rHom S B; f ∈ pHom R S X, A B Y; ∀x∈carrier S. f x = h x; pol_coeff S c|] ==> fst (cf_h f c) = fst (cf_h h c)" by (simp add:cf_h_def) lemma (in PolynRg) cf_h_len2:"[|PolynRg A B Y; f ∈ pHom R S X, A B Y; pol_coeff S c|] ==> fst (cf_h f c) = fst c" by (simp add:cf_h_def) lemma (in PolynRg) cmp_pol_coeff:"[|f ∈ rHom S B; pol_coeff S (n, c)|] ==> pol_coeff B (n,(cmp f c))" apply (simp add:pol_coeff_def, rule allI, rule impI, simp add:cmp_def, frule_tac a = j in forall_spec, simp, thin_tac "∀j≤n. c j ∈ carrier S") apply (simp add:rHom_mem) done lemma (in PolynRg) cmp_pol_coeff_e:"[|PolynRg A B Y; f ∈ pHom R S X, A B Y; pol_coeff S (n, c)|] ==> pol_coeff B (n, (cmp f c))" apply (subst pol_coeff_def) apply (rule allI, rule impI, simp) apply (frule_tac j = j in pol_coeff_mem[of "(n, c)"], simp) apply (simp add:polyn_Hom_def cmp_def, (erule conjE)+) apply (simp add:image_def) apply (rule_tac c = "f (c j)" in subsetD[of "{y. ∃x∈carrier S. y = f x}" "carrier B"], assumption+) apply (simp, blast) done lemma (in PolynRg) cf_h_pol_coeff:"[|PolynRg A B Y; h ∈ rHom S B; pol_coeff S (n, f)|] ==> cf_h h (n, f) = (n, cmp h f)" by (simp add:cf_h_def) lemma (in PolynRg) cf_h_polyn:"[|PolynRg A B Y; h ∈ rHom S B; pol_coeff S (n, f)|] ==> polyn_expr A Y n (cf_h h (n, f)) = polyn_expr A Y n (n, (cmp h f))" apply (frule cf_h_coeff[of A B Y h "(n, f)"], assumption+, frule cmp_pol_coeff[of h B n f], assumption+) apply (rule PolynRg.polyn_exprs_eq[of A B Y "cf_h h (n, f)" "(n, cmp h f)" n], assumption+, simp add:cf_h_len, rule allI, rule impI, simp add:cf_h_def) done lemma (in PolynRg) pHom_rHom:"[|PolynRg A B Y; f ∈ pHom R S X, A B Y|] ==> f ∈ rHom R A" by (simp add:polyn_Hom_def) lemma (in PolynRg) pHom_X_Y:"[|PolynRg A B Y; f ∈ pHom R S X, A B Y|] ==> f X = Y" by (simp add:polyn_Hom_def) lemma (in PolynRg) pHom_memTr:"[|PolynRg A B Y; f ∈ pHom R S X, A B Y|] ==> ∀c. pol_coeff S (n, c) --> f (polyn_expr R X n (n, c)) = polyn_expr A Y n (n, cmp f c)" apply (cut_tac subring, frule subring_Ring, frule PolynRg.is_Ring[of A B Y], frule PolynRg.subring[of A B Y], frule Ring.subring_Ring[of A B], assumption) apply (induct_tac n) apply (rule allI, rule impI) apply (simp add:polyn_expr_def cmp_def) apply (frule_tac c = "(0, c)" and j = 0 in pol_coeff_mem, simp, simp, frule_tac x = "c 0" in mem_subring_mem_ring, assumption+, simp add:polyn_Hom_def, (erule conjE)+, frule rHom_func[of f R A], frule_tac x = "c 0" in funcset_mem[of f "carrier R" "carrier A"], assumption+, simp add:ring_r_one, simp add:Ring.ring_r_one) apply (rule allI, rule impI) apply (cut_tac n = n and f = c in pol_coeff_pre, assumption) apply ( drule_tac a = c in forall_spec, assumption) apply (cut_tac n = n and c = "(Suc n, c)" in polyn_Suc, simp, simp del:npow_suc, thin_tac "polyn_expr R X (Suc n) (Suc n, c) = polyn_expr R X n (Suc n, c) ± c (Suc n) ·r X^R (Suc n)") apply (frule_tac c = "(Suc n, c)" and k = n in polyn_expr_short, simp) apply (simp del:npow_suc, thin_tac "polyn_expr R X n (Suc n, c) = polyn_expr R X n (n, c)") apply (frule_tac c = "(Suc n, c)" in polyn_Hom_coeff_to_coeff[of A B Y f], assumption+, simp del:npow_suc add:cf_h_def) apply (frule_tac c = "(Suc n, cmp f c)" and n = n in PolynRg.polyn_Suc[of A B Y], simp, simp del:npow_suc, thin_tac "polyn_expr A Y (Suc n) (Suc n, cmp f c) = polyn_expr A Y n (Suc n, cmp f c) ±A cmp f c (Suc n) ·rA Y^A (Suc n)") apply (frule_tac k = n and c = "(n, c)" in polyn_mem, simp) apply (frule_tac c = "(Suc n, c)" in monomial_mem, drule_tac a = "Suc n" in forall_spec, simp, simp del:npow_suc) apply (frule pHom_rHom[of A B Y f], assumption+, simp del:npow_suc add:rHom_add) apply (frule_tac c = "(Suc n, c)" and j = "Suc n" in pol_coeff_mem_R, simp, simp del:npow_suc) apply (cut_tac X_mem_R, frule_tac n = "Suc n" in npClose[of X], cut_tac Ring, subst rHom_tOp[of R A _ _ f], assumption+) apply (frule_tac c = "(Suc n, cmp f c)" and k = n in PolynRg.polyn_expr_short[of A B Y], assumption+, simp, simp del:npow_suc) apply (cut_tac c = "(Suc n, cmp f c)" and n = n in PolynRg.pol_coeff_le[of A B Y], assumption+, simp, simp del:npow_suc add:PolynRg.pol_coeff_le[of A B Y]) apply (subst rHom_npow[of R A X f], assumption+, simp del:npow_suc add:pHom_X_Y cmp_def) done lemma (in PolynRg) pHom_mem:"[|PolynRg A B Y; f ∈ pHom R S X, A B Y; pol_coeff S (n, c)|] ==> f (polyn_expr R X n (n, c)) = polyn_expr A Y n (n, cmp f c)" apply (simp add:pHom_memTr) done lemma (in PolynRg) pHom_memc:"[|PolynRg A B Y; f ∈ pHom R S X, A B Y; pol_coeff S c|] ==> f (polyn_expr R X (fst c) c) = polyn_expr A Y (fst c) (cf_h f c)" by (cases c) (simp add: cf_h_def pHom_mem) lemma (in PolynRg) pHom_mem1:"[|PolynRg A B Y; f ∈ pHom R S X, A B Y; p ∈ carrier R|] ==> f p ∈ carrier A" apply (simp add:polyn_Hom_def, (erule conjE)+) apply (simp add:rHom_mem) done lemma (in PolynRg) pHom_pol_mem:"[|PolynRg A B Y; f ∈ pHom R S X, A B Y; p ∈ carrier R; p ≠ \<zero>|] ==> f p = polyn_expr A Y (deg_n R S X p) (cf_h f (s_cf R S X p))" apply (frule s_cf_expr[of p], assumption, (erule conjE)+) apply (subst s_cf_deg[of p], assumption+) apply (subst pHom_memc[THEN sym, of A B Y f], assumption+) apply (drule sym, simp) done lemma (in PolynRg) erh_rHom_coeff:"[|PolynRg A B Y; h ∈ rHom S B; pol_coeff S c|] ==> erh R S X A B Y h 0 c = (cmp h (snd c)) 0" apply (cut_tac subring, frule subring_Ring, frule PolynRg.is_Ring[of A B Y], frule PolynRg.subring[of A B Y], frule Ring.subring_Ring[of A B], assumption) apply (simp add:erh_def polyn_expr_def cf_h_def) apply (frule pol_coeff_mem [of c 0], simp) apply (simp add:cmp_def, frule rHom_mem[of h S B "snd c 0"], assumption) apply (frule Ring.mem_subring_mem_ring[of A B "h (snd c 0)"], assumption+, simp add:Ring.ring_r_one) done lemma (in PolynRg) erh_polyn_exprs:"[|PolynRg A B Y; h ∈ rHom S B; pol_coeff S c; pol_coeff S d; polyn_expr R X (fst c) c = polyn_expr R X (fst d) d|] ==> erh R S X A B Y h (fst c) c = erh R S X A B Y h (fst d) d" apply (cut_tac subring, frule subring_Ring, frule PolynRg.is_Ring[of A B Y], frule PolynRg.subring[of A B Y], frule Ring.subring_Ring[of A B], assumption+) apply (simp add:erh_def) apply (cut_tac less_linear[of "fst c" "fst d"]) apply (erule disjE, frule pol_expr_unique3[of c d], assumption+, simp, thin_tac "polyn_expr R X (fst c) c = polyn_expr R X (fst d) d", frule cf_h_coeff[of A B Y h c], assumption+, frule cf_h_coeff[of A B Y h d], assumption+) apply (frule PolynRg.pol_expr_unique3[of A B Y "cf_h h c" "cf_h h d"], assumption+, simp add:cf_h_len, simp add:cf_h_len, thin_tac "(polyn_expr A Y (fst c) (cf_h h c) = polyn_expr A Y (fst d) (cf_h h d)) = ((∀j≤fst c. snd (cf_h h c) j = snd (cf_h h d) j) ∧ (∀j∈nset (Suc (fst c)) (fst d). snd (cf_h h d) j = \<zero>B))", simp add:cf_h_def cmp_def, simp add:rHom_0_0) apply (erule disjE, frule pol_expr_unique2[of c d], assumption+, simp, thin_tac "polyn_expr R X (fst d) c = polyn_expr R X (fst d) d", frule cf_h_coeff[of A B Y h c], assumption+, frule cf_h_coeff[of A B Y h d], assumption+) apply (frule PolynRg.pol_expr_unique2[of A B Y "cf_h h c" "cf_h h d"], assumption+, simp add:cf_h_len, simp add:cf_h_len, thin_tac "(polyn_expr A Y (fst d) (cf_h h c) = polyn_expr A Y (fst d) (cf_h h d)) = (∀j≤fst d. snd (cf_h h c) j = snd (cf_h h d) j)", simp add:cf_h_def cmp_def) apply (drule sym, rule sym, frule pol_expr_unique3[of d c], assumption+, simp, thin_tac "polyn_expr R X (fst d) d = polyn_expr R X (fst c) c", frule cf_h_coeff[of A B Y h c], assumption+, frule cf_h_coeff[of A B Y h d], assumption+) apply (frule PolynRg.pol_expr_unique3[of A B Y "cf_h h d" "cf_h h c"], assumption+, simp add:cf_h_len, simp add:cf_h_len, thin_tac "(polyn_expr A Y (fst d) (cf_h h d) = polyn_expr A Y (fst c) (cf_h h c)) = ((∀j≤fst d. snd (cf_h h d) j = snd (cf_h h c) j) ∧ (∀j∈nset (Suc (fst d)) (fst c). snd (cf_h h c) j = \<zero>B))", simp add:cf_h_def cmp_def, simp add:rHom_0_0) done constdefs erH::"[('a, 'm) Ring_scheme, ('a, 'm1) Ring_scheme, 'a, ('b, 'n) Ring_scheme, ('b, 'n1) Ring_scheme, 'b, 'a => 'b] => 'a => 'b" "erH R S X A B Y h == λx∈carrier R. erh R S X A B Y h (fst (s_cf R S X x)) (s_cf R S X x)" (* lemma (in PolynRg) erH_phom:"[|PolynRg A B y; h ∈ rHom S B|] ==> erH R S X A B Y h ∈ pHom R S X, A B Y" *) lemma (in PolynRg) erH_rHom_0:"[|PolynRg A B Y; h ∈ rHom S B|] ==> (erH R S X A B Y h) \<zero> = \<zero>A" apply (cut_tac subring, frule subring_Ring, cut_tac PolynRg.is_Ring[of A B Y], cut_tac PolynRg.subring[of A B Y], cut_tac Ring.subring_Ring[of A B]) apply (simp add:erH_def erh_def s_cf_def polyn_expr_def) apply (cut_tac ring_zero, simp add:cf_h_def cmp_def rHom_0_0, simp add:Ring.Subring_zero_ring_zero, frule Ring.ring_zero[of A], simp add:Ring.ring_r_one, assumption+) done lemma (in PolynRg) erH_mem:"[|PolynRg A B Y; h ∈ rHom S B; p ∈ carrier R|] ==> erH R S X A B Y h p ∈ carrier A" apply (cut_tac subring, frule subring_Ring, cut_tac PolynRg.is_Ring[of A B Y], cut_tac PolynRg.subring[of A B Y], cut_tac Ring.subring_Ring[of A B]) apply (case_tac "p = \<zero>R") apply (simp add:erH_rHom_0, simp add:Ring.ring_zero) apply (simp add:erH_def erh_def) apply (frule s_cf_expr[of p], assumption, (erule conjE)+) apply (rule PolynRg.polyn_mem[of A B Y "cf_h h (s_cf R S X p)"], assumption+) apply (simp add:cf_h_coeff) apply (simp add:cf_h_len, assumption+) done lemma (in PolynRg) erH_rHom_nonzero:"[|PolynRg A B Y; f ∈ rHom S B; p ∈ carrier R; (erH R S X A B Y f) p ≠ \<zero>A|] ==> p ≠ \<zero>" apply (rule contrapos_pp, simp+) apply (simp add:erH_rHom_0) done lemma (in PolynRg) erH_rHomTr2:"[|PolynRg A B Y; h ∈ rHom S B|] ==> (erH R S X A B Y h) (1r) = (1rA)" apply (cut_tac subring, frule subring_Ring, frule PolynRg.is_Ring[of A B Y], frule PolynRg.subring[of A B Y], frule Ring.subring_Ring[of A B], assumption, cut_tac polyn_ring_nonzero) apply (cut_tac Subring_one_ring_one[THEN sym, of S], frule Ring.ring_one[of S], cut_tac ring_one) apply (frule s_cf_expr[of "1r"], assumption+, (erule conjE)+) apply (frule s_cf_deg[THEN sym, of "1r"], assumption, simp) apply (cut_tac pol_of_deg0[THEN sym, of "1r"], simp, simp add:erH_def erh_def cf_h_def polyn_expr_def, frule pol_coeff_mem[of "s_cf R S X 1rS" 0], simp) apply (simp add:Subring_tOp_ring_tOp[THEN sym], simp add:Ring.ring_r_one cmp_def) apply (simp add:rHom_one, simp add:Ring.Subring_one_ring_one[of A B], frule Ring.ring_one[of A], simp add:Ring.ring_r_one) apply (simp add:ring_one) apply simp apply assumption done lemma (in PolynRg) erH_multTr:"[|PolynRg A B Y; h ∈ rHom S B; pol_coeff S c|] ==> ∀f g. pol_coeff S (m, f) ∧ pol_coeff S (((fst c) + m), g) ∧ (polyn_expr R X (fst c) c) ·r (polyn_expr R X m (m, f)) = (polyn_expr R X ((fst c) + m) ((fst c) + m, g)) --> (polyn_expr A Y (fst c) (cf_h h c)) ·rA (polyn_expr A Y m (cf_h h (m, f))) = (polyn_expr A Y ((fst c) + m) (cf_h h ((fst c)+m, g)))" apply (cut_tac subring, frule subring_Ring, frule PolynRg.is_Ring[of A B Y], frule PolynRg.subring[of A B Y], frule Ring.subring_Ring[of A B], assumption) apply (cases c) apply (simp only:) apply (rename_tac l u) apply (thin_tac "c = (l, u)") apply (induct_tac m) apply ((rule allI)+, rule impI, (erule conjE)+, simp) apply (simp add:cf_h_polyn[of A B Y h]) apply (simp add:polyn_expr_def[of _ _ 0]) apply (frule_tac c = "(0, f)" and j = 0 in pol_coeff_mem, simp, simp, frule_tac c = "(0, f)" and j = 0 in pol_coeff_mem_R, simp, simp, frule_tac c = "(l, u)" and k = l in polyn_mem, simp, simp add:ring_r_one, simp add:ring_tOp_commute, simp add:scalar_times_pol_expr) apply (frule_tac c = "(0, f)" in cf_h_coeff[of A B Y h], assumption+, frule_tac c = "(l, u)" in cf_h_coeff[of A B Y h], assumption+) apply (frule_tac c = "cf_h h (0, f)" in PolynRg.pol_coeff_mem[of A B Y _ 0], assumption+, simp, simp add:cf_h_cmp, frule_tac c = "cf_h h (0, f)" in PolynRg.pol_coeff_mem_R[of A B Y _ 0], assumption+, simp, simp add:cf_h_cmp, frule_tac c = "cf_h h (l, u)" and k = l in PolynRg.polyn_mem, simp, simp add:cf_h_len, simp add:cf_h_polyn, simp add:Ring.ring_r_one, simp add:Ring.ring_tOp_commute[of A], frule_tac n = l and f = u in cf_h_pol_coeff[of A B Y h], assumption+, simp) apply (simp add:PolynRg.scalar_times_pol_expr, frule_tac c = "(l, u)" and a = "f 0" in sp_cf_pol_coeff, assumption+, frule_tac c = "(l, cmp h u)" and a = "(cmp h f) 0" in PolynRg.sp_cf_pol_coeff, assumption+, frule_tac c = "(l, g)" in cf_h_coeff[of A B Y h], assumption+, simp add:cf_h_pol_coeff) apply (rule_tac c = "sp_cf B (cmp h f 0) (l, cmp h u)" and d = "(l, cmp h g)" and k = l in PolynRg.polyn_exprs_eq[of A B Y], assumption+, simp add:sp_cf_len, simp add:PolynRg.sp_cf_len) apply (rule allI, rule impI) apply (frule_tac c = "sp_cf S (f 0) (l, u)" and d = "(l, g)" in pol_expr_unique2, assumption+, simp add:sp_cf_len, simp add:sp_cf_len) apply (drule_tac a = j in forall_spec, simp) apply (simp add:sp_cf_def) apply (rotate_tac -1, drule sym, simp add:cmp_def, thin_tac "pol_coeff B (l, λx. h (g x))", thin_tac "pol_coeff B (l, λj. h (f 0) ·rB h (u j))", thin_tac "pol_coeff S (l, λj. f 0 ·rS u j)", thin_tac "polyn_expr A Y l (l, λx. h (u x)) ∈ carrier A", thin_tac "pol_coeff B (l, λx. h (u x))", thin_tac "polyn_expr R X l (l, λj. f 0 ·rS u j) = polyn_expr R X l (l, g)") apply (frule_tac c = "(l, u)" and j = j in pol_coeff_mem, simp, simp) apply (simp add:rHom_tOp) apply ((rule allI)+, (rule impI), (erule conjE)+) apply (simp add:cf_h_polyn, frule_tac n = n and f = f in pol_coeff_pre, frule_tac n = "l + n" and f = g in pol_coeff_pre, frule_tac n = l and f = u and m = n and g = f in polyn_expr_tOp, assumption+, erule exE, (erule conjE)+, rotate_tac -1, drule sym) apply (drule_tac a = f in forall_spec1, drule_tac a = e in forall_spec1, simp, frule_tac n = n and f = f in polyn_Suc_split, simp del:npow_suc, thin_tac "polyn_expr R X (Suc n) (Suc n, f) = polyn_expr R X n (n, f) ± f (Suc n) ·r X^R (Suc n)") (* got polyn_expr A Y l (l, cmp h u) ·rA polyn_expr A Y n (n, cmp h f) = polyn_expr A Y (l + n) (l + n, cmp h e) *) apply (frule_tac c = "(Suc n, f)" in cf_h_coeff[of A B Y h], assumption+, simp del:npow_suc add:cf_h_pol_coeff) apply (frule_tac n = n and f = "cmp h f" in PolynRg.polyn_Suc_split[of A B Y], simp add:cf_h_pol_coeff, simp del:npow_suc, thin_tac "polyn_expr A Y (Suc n) (Suc n, cmp h f) = polyn_expr A Y n (n, cmp h f) ±A cmp h f (Suc n) ·rA Y^A (Suc n)") apply (frule_tac c = "(l, u)" and k = l in polyn_mem, simp, frule_tac n = n and f = f in pol_coeff_pre, frule_tac c = "(n, f)" and k = n in polyn_mem, simp, frule_tac c = "(Suc n, f)" and j = "Suc n" in pol_coeff_mem_R, simp, cut_tac X_mem_R, simp del:npow_suc, cut_tac n = "Suc n" in npClose[of X], assumption, frule_tac x = "f (Suc n)" and y = " X^R (Suc n)" in ring_tOp_closed, assumption+, simp del:npow_suc add:ring_distrib1) apply (frule_tac c = "(l, u)" in cf_h_coeff[of A B Y h], assumption+, frule_tac c = "(Suc n, f)" in cf_h_coeff[of A B Y h], assumption+, frule_tac n = n and f = f in pol_coeff_pre, frule_tac c = "(n, f)" in cf_h_coeff[of A B Y h], assumption+, simp del:npow_suc add:cf_h_pol_coeff) apply (frule_tac c = "(l, cmp h u)" and k = l in PolynRg.polyn_mem, simp, simp, frule_tac c = "(n, cmp h f)" and k = n in PolynRg.polyn_mem, simp, simp) apply (frule_tac c = "(Suc n, f)" and j = "Suc n" in pol_coeff_mem_R, simp, cut_tac X_mem_R, simp del:npow_suc, cut_tac n = "Suc n" in npClose[of X], assumption, frule_tac x = "f (Suc n)" and y = " X^R (Suc n)" in ring_tOp_closed, assumption+, simp del:npow_suc add:ring_distrib1) apply (frule_tac c = "(Suc n, cmp h f)" and j = "Suc n" in PolynRg.pol_coeff_mem_R[of A B Y], simp del:npow_suc, simp del:npow_suc, frule_tac PolynRg.X_mem_R[of A B Y], simp del:npow_suc, frule_tac n = "Suc n" in Ring.npClose[of A Y], assumption, frule_tac x = "cmp h f (Suc n)" and y = " Y^A (Suc n)" in Ring.ring_tOp_closed[of A], assumption+, simp del:npow_suc add:Ring.ring_distrib1) apply (frule_tac x1 = "polyn_expr R X l (l, u)" and y1 = "f (Suc n)" and z1 = " X^R (Suc n)" in ring_tOp_assoc[THEN sym], assumption+, simp del:npow_suc, thin_tac "polyn_expr R X l (l, u) ·r polyn_expr R X n (n, f) = polyn_expr R X (l + n) (l + n, e)", thin_tac "polyn_expr R X l (l, u) ·r (f (Suc n) ·r X^R (Suc n)) = polyn_expr R X l (l, u) ·r f (Suc n) ·r X^R (Suc n)", simp only:ring_tOp_commute, frule_tac c = "(Suc n, f)" and j = "Suc n" in pol_coeff_mem, simp, simp del:npow_suc, simp del:npow_suc add:scalar_times_pol_expr) apply (frule_tac c = "(l, u)" and a = "f (Suc n)" in sp_cf_pol_coeff, assumption+, frule_tac c = "sp_cf S (f (Suc n)) (l, u)" and k = l in polyn_mem, simp add:sp_cf_len, simp only:ring_tOp_commute, frule_tac c1 = "sp_cf S (f (Suc n)) (l, u)" and j1 = "Suc n" in low_deg_terms_zero1[THEN sym], simp only:sp_cf_len, simp del:npow_suc) apply (frule_tac c = "sp_cf S (f (Suc n)) (l, u)" and n = "Suc n" in ext_cf_pol_coeff, frule_tac c = "(l + n, e)" and d = "ext_cf S (Suc n) (sp_cf S ( f (Suc n)) (l, u))" in polyn_add1, assumption+, simp del:npow_suc add:ext_cf_len sp_cf_len, cut_tac a = l and b = n in add_commute, simp del:npow_suc add:max_def, thin_tac "polyn_expr R X (n + l) (n + l, e) ± polyn_expr R X (Suc (n + l)) (ext_cf S (Suc n) (sp_cf S (f (Suc n)) (l, u))) = polyn_expr R X (Suc (n + l)) (add_cf S (n + l, e) (ext_cf S (Suc n) (sp_cf S (f (Suc n)) (l, u))))", thin_tac "polyn_expr R X l (l, u) ∈ carrier R", thin_tac "polyn_expr R X n (n, f) ∈ carrier R", thin_tac "f (Suc n) ∈ carrier R", thin_tac "X ∈ carrier R", thin_tac "X^R (Suc n) ∈ carrier R", thin_tac "f (Suc n) ·r X^R (Suc n) ∈ carrier R", thin_tac "polyn_expr R X l (sp_cf S (f (Suc n)) (l, u)) ∈ carrier R", thin_tac "X^R (Suc n) ·r polyn_expr R X l (sp_cf S (f (Suc n)) (l, u)) = polyn_expr R X (Suc (n + l)) (ext_cf S (Suc n) (sp_cf S (f (Suc n)) (l, u)))") (* got polyn_expr R X (Suc (n + l)) (Suc (n + l), g) = polyn_expr R X (Suc (n + l)) (add_cf S (n + l, e) (ext_cf S (Suc n) (sp_cf S (f (Suc n)) (l, u)))) *) apply (subst Ring.ring_tOp_assoc[THEN sym], assumption+, subst Ring.ring_tOp_commute, assumption+) apply (frule_tac c = "(Suc n, f)" in cf_h_coeff[of A B Y h], assumption+, simp only:cf_h_pol_coeff) apply (frule_tac c = "(Suc n, cmp h f)" and j = "Suc n" in PolynRg.pol_coeff_mem[of A B Y], assumption+, simp, simp del:npow_suc) apply (subst PolynRg.scalar_times_pol_expr[of A B Y], assumption+, simp) apply (frule_tac a = "cmp h f (Suc n)" and c = "(l, cmp h u)" in PolynRg.sp_cf_pol_coeff[of A B Y], assumption+) apply (frule_tac c = "sp_cf B (cmp h f (Suc n)) (l, cmp h u)" and k = l in PolynRg.polyn_mem[of A B Y], assumption, simp) apply (simp add:PolynRg.sp_cf_len) apply (subst Ring.ring_tOp_commute[of A], assumption+) apply (frule_tac c1 = "sp_cf B (cmp h f (Suc n)) (l, cmp h u)" and j1 = "Suc n" in PolynRg.low_deg_terms_zero1[of A B Y, THEN sym], assumption+) apply (simp del:npow_suc add:sp_cf_len PolynRg.sp_cf_len, thin_tac "Y^A (Suc n) ·rA polyn_expr A Y l (sp_cf B (cmp h f (Suc n)) (l, cmp h u)) = polyn_expr A Y (Suc (l + n)) (ext_cf B (Suc n) (sp_cf B (cmp h f (Suc n)) (l, cmp h u)))", thin_tac "polyn_expr A Y l (sp_cf B (cmp h f (Suc n)) (l, cmp h u)) ∈ carrier A") apply (frule_tac c = "sp_cf B (cmp h f (Suc n)) (l, cmp h u)" and n = "Suc n" in PolynRg.ext_cf_pol_coeff[of A B Y], assumption+) apply (frule_tac c = "(l + n, cmp h e)" and d = "ext_cf B (Suc n) (sp_cf B (cmp h f (Suc n)) (l, cmp h u))" in PolynRg.polyn_add1[of A B Y]) apply (frule_tac c = "(n + l, e)" in cf_h_coeff[of A B Y h], assumption+) apply (simp add:cf_h_pol_coeff[of A B Y h] add_commute, assumption) apply (simp add:PolynRg.ext_cf_len PolynRg.sp_cf_len) apply (cut_tac a = n and b = l in add_commute, simp) (** Now we got polyn_expr A Y (max (l + n) (Suc (l + n))) (add_cf B (l + n, cmp h e) (ext_cf B (Suc n) (sp_cf B (cmp h f (Suc n)) (l, cmp h u)))) = polyn_expr A Y (Suc (l + n)) (Suc (l + n), cmp h g) *) apply (frule_tac c = "(l + n, e)" and d = "ext_cf S (Suc n) (sp_cf S (f (Suc n)) (l, u))" in add_cf_pol_coeff, assumption+) apply (frule_tac c = "(l + n, cmp h e)" and d = "ext_cf B (Suc n) (sp_cf B (cmp h f (Suc n)) (l, cmp h u))" in PolynRg.add_cf_pol_coeff[of A B Y]) apply (frule_tac c = "(l + n, e)" in cf_h_coeff[of A B Y h], assumption+) apply (simp add:cf_h_pol_coeff) apply simp apply (simp add:max_def) apply (thin_tac "polyn_expr A Y l (l, cmp h u) ·rA polyn_expr A Y n (n, cmp h f) = polyn_expr A Y (l + n) (l + n, cmp h e)", thin_tac "polyn_expr A Y l (l, cmp h u) ∈ carrier A", thin_tac "polyn_expr A Y n (n, cmp h f) ∈ carrier A", thin_tac "Y ∈ carrier A", thin_tac "Y^A n ·rA Y ∈ carrier A", thin_tac "cmp h f (Suc n) ·rA (Y^A n ·rA Y) ∈ carrier A", thin_tac "polyn_expr A Y (l + n) (l + n, cmp h e) ±A polyn_expr A Y (Suc (l + n)) (ext_cf B (Suc n) (sp_cf B (cmp h f (Suc n)) (l, cmp h u))) = polyn_expr A Y (Suc (l + n)) (add_cf B (l + n, cmp h e) (ext_cf B (Suc n) (sp_cf B (cmp h f (Suc n)) (l, cmp h u))))") apply (frule_tac c = "(Suc (l + n), g)" in cf_h_coeff[of A B Y h], assumption+) apply (simp add:cf_h_pol_coeff) apply (frule_tac c = "(Suc (l + n), g)" and d = "add_cf S (l + n, e) (ext_cf S (Suc n) (sp_cf S (f (Suc n)) (l, u)))" in pol_expr_unique2) apply assumption apply (simp add:add_cf_len) apply (simp add:ext_cf_len sp_cf_len max_def) apply (simp add:add_cf_len ext_cf_len sp_cf_len max_def) apply (cut_tac a = n and b = l in add_commute, simp, thin_tac "pol_coeff B (add_cf B (l + n, cmp h e) (ext_cf B (Suc n) (sp_cf B (cmp h f (Suc n)) (l, cmp h u))))", thin_tac "pol_coeff B (Suc (l + n), cmp h g)", thin_tac "pol_coeff S (add_cf S (l + n, e) (ext_cf S (Suc n) (sp_cf S (f (Suc n)) (l, u))))", thin_tac "pol_coeff B (ext_cf B (Suc n) (sp_cf B (cmp h f (Suc n)) (l, cmp h u)))", thin_tac "pol_coeff B (sp_cf B (cmp h f (Suc n)) (l, cmp h u))", thin_tac "polyn_expr R X (Suc (l + n)) (Suc (l + n), g) = polyn_expr R X (Suc (l + n)) (add_cf S (l + n, e) (ext_cf S (Suc n) (sp_cf S (f (Suc n)) (l, u))))") apply (rule sym) apply (frule_tac c = "(Suc (l + n), g)" in cf_h_coeff[of A B Y h], assumption+, frule_tac c = "(l + n, e)" in cf_h_coeff[of A B Y h], assumption+) apply (frule_tac c = "(l, cmp h u)" and a = "cmp h f (Suc n)" in PolynRg.sp_cf_pol_coeff[of A B Y], assumption+) apply (cut_tac c = "(l + n, cmp h e)" and d = "ext_cf B (Suc n) (sp_cf B (cmp h f (Suc n)) (l, cmp h u))" in PolynRg.add_cf_pol_coeff, assumption+) apply (simp add:cf_h_pol_coeff) apply (rule PolynRg.ext_cf_pol_coeff, assumption+) apply (frule_tac c = "(Suc (l + n), cmp h g)" and d = "add_cf B (l + n, cmp h e) (ext_cf B (Suc n) (sp_cf B (cmp h f (Suc n)) (l, cmp h u)))" in PolynRg.pol_expr_unique2[of A B Y]) apply (simp add:cf_h_pol_coeff) apply assumption apply (simp add:add_cf_len) apply (frule_tac n = "l + n" and f = e in cf_h_pol_coeff[of A B Y h], assumption+) apply (frule_tac c = "sp_cf B (cmp h f (Suc n)) (l, cmp h u)" and n = "Suc n" in PolynRg.ext_cf_pol_coeff[of A B Y], assumption+) apply (simp add:PolynRg.add_cf_len) apply (simp add:PolynRg.ext_cf_len) apply (simp add:PolynRg.sp_cf_len max_def) apply (simp add:PolynRg.add_cf_len) apply (frule_tac c = "sp_cf B (cmp h f (Suc n)) (l, cmp h u)" and n = "Suc n" in PolynRg.ext_cf_pol_coeff[of A B Y], assumption+) apply (frule_tac c = "(l + n, cmp h e)" and d = "ext_cf B (Suc n) (sp_cf B (cmp h f (Suc n)) (l, cmp h u))" in PolynRg.add_cf_pol_coeff[of A B Y]) apply (simp add:cf_h_pol_coeff, assumption) apply (simp add:cf_h_pol_coeff) apply (simp add:PolynRg.add_cf_len) apply (simp add:PolynRg.ext_cf_len) apply (simp add:PolynRg.sp_cf_len max_def) apply (cut_tac a = n and b = l in add_commute, simp) (* we got ∀j≤Suc (l + n). cmp h g j = snd (add_cf B (l + n, cmp h e) (ext_cf B (Suc n) (sp_cf B (cmp h f (Suc n)) (l, cmp h u)))) j *) apply (thin_tac "(polyn_expr A Y (Suc (l + n)) (Suc (l + n), cmp h g) = polyn_expr A Y (Suc (l + n)) (add_cf B (l + n, cmp h e) (ext_cf B (Suc n) (sp_cf B (cmp h f (Suc n)) (l, cmp h u))))) = (∀j≤Suc (l + n). cmp h g j = snd (add_cf B (l + n, cmp h e) (ext_cf B (Suc n) (sp_cf B (cmp h f (Suc n)) (l, cmp h u)))) j)") apply (rule allI, rule impI) apply (subst cmp_def)+ apply (drule_tac a = j in forall_spec, simp, simp, thin_tac "g j = snd (add_cf S (l + n, e) (ext_cf S (Suc n) (sp_cf S (f (Suc n)) (l, u)))) j") apply (case_tac "j = Suc (l+n)", simp) apply ((subst add_cf_def)+, simp add:ext_cf_len, simp add:sp_cf_len, simp add:cmp_def PolynRg.ext_cf_len, simp add:PolynRg.sp_cf_len, (subst ext_cf_def)+, simp add:sp_cf_len sliden_def, (subst sp_cf_def)+, simp, frule_tac c = "(l, u)" and j = l in pol_coeff_mem, simp, simp, simp add:rHom_tOp) apply (frule_tac m = j and n = "Suc (l + n)" in noteq_le_less, assumption, thin_tac "j ≤ Suc (l + n)", thin_tac "j ≠ Suc (l + n)", (subst add_cf_def)+, simp add:ext_cf_len sp_cf_len, simp add:cmp_def, simp add:PolynRg.ext_cf_len PolynRg.sp_cf_len, (subst ext_cf_def)+, simp add:sp_cf_len, (subst sp_cf_def)+, simp add:sliden_def, frule_tac x = j and n = "l + n" in Suc_less_le) apply (rule conjI) apply (rule impI, frule_tac x = j and y = "Suc (l + n)" in less_imp_le, frule_tac m = j and n = "Suc (l + n)" and l = "Suc n" in diff_le_mono, simp, frule_tac c = "(l, u)" and j = "j - Suc n" in pol_coeff_mem, simp, frule_tac c = "(l + n, e)" and j = j in pol_coeff_mem, simp, simp, frule_tac x = "f (Suc n)" and y = "u (j - Suc n)" in Ring.ring_tOp_closed[of S], assumption+, simp add:rHom_add rHom_tOp) apply (rule impI) apply (frule_tac c = "(l + n, e)" and j = j in pol_coeff_mem, simp, simp, frule_tac Ring.ring_zero[of S], simp add:rHom_add rHom_0_0) done lemma (in PolynRg) erH_multTr1:"[|PolynRg A B Y; h ∈ rHom S B; pol_coeff S c; pol_coeff S d; pol_coeff S e; fst e = fst c + fst d; (polyn_expr R X (fst c) c) ·r (polyn_expr R X (fst d) d) = polyn_expr R X ((fst c) + (fst d)) e |] ==> (polyn_expr A Y (fst c) (cf_h h c)) ·rA (polyn_expr A Y (fst d) (cf_h h d)) = (polyn_expr A Y (fst e) (cf_h h e))" by (cases d, cases e) (simp add: erH_multTr) lemma (in PolynRg) erHomTr0:"[|PolynRg A B Y; h ∈ rHom S B; x ∈ carrier R|] ==> erH R S X A B Y h (-a x) = -aA (erH R S X A B Y h x)" apply (cut_tac ring_is_ag, cut_tac subring, frule subring_Ring, frule PolynRg.is_Ring[of A B Y], frule Ring.ring_is_ag[of A], frule PolynRg.subring[of A B Y], frule Ring.subring_Ring[of A B], assumption+) apply (case_tac "x = \<zero>R", simp add:aGroup.ag_inv_zero, simp add:erH_rHom_0[of A B Y h], frule Ring.ring_is_ag[of A], simp add:aGroup.ag_inv_zero) apply (simp add:erH_def erh_def) apply (simp add:aGroup.ag_mOp_closed) apply (frule_tac p = x in s_cf_expr, assumption+, (erule conjE)+) apply (frule_tac x = x in aGroup.ag_mOp_closed, assumption+, frule_tac p = "-a x" in s_cf_expr, thin_tac "x = polyn_expr R X (fst (s_cf R S X x)) (s_cf R S X x)", rule contrapos_pp, simp+, frule_tac x = x in aGroup.ag_inv_inv, simp, simp add:aGroup.ag_inv_zero, (erule conjE)+) apply (frule_tac c = "s_cf R S X (-a x)" in cf_h_coeff[of A B Y h], assumption+, frule_tac c = "s_cf R S X x" in cf_h_coeff[of A B Y h], assumption+) apply (frule polyn_minus_m_cf[of "s_cf R S X x" "fst (s_cf R S X x)"], simp) apply (cut_tac a = "-a x" and b = "polyn_expr R X (fst (s_cf R S X (-a x))) (s_cf R S X (-a x))" and c = "polyn_expr R X (fst (s_cf R S X x)) (m_cf S (s_cf R S X x))" in box_equation, assumption, simp, thin_tac "x = polyn_expr R X (fst (s_cf R S X x)) (s_cf R S X x)", thin_tac "-a x = polyn_expr R X (fst (s_cf R S X (-a x))) (s_cf R S X (-a x))", thin_tac "-a (polyn_expr R X (fst (s_cf R S X x)) (s_cf R S X x)) = polyn_expr R X (fst (s_cf R S X x)) (m_cf S (s_cf R S X x))", frule m_cf_pol_coeff[of "s_cf R S X x"]) apply (subst PolynRg.polyn_minus_m_cf[of A B Y], assumption+, simp add:cf_h_len) apply (frule_tac c = "cf_h h (s_cf R S X x)" in PolynRg.m_cf_pol_coeff[of A B Y], assumption, frule PolynRg.pol_expr_unique2[of A B Y "cf_h h (s_cf R S X (-a x))" "m_cf B (cf_h h (s_cf R S X x))"], assumption+) apply (simp add:cf_h_len) apply (simp add:PolynRg.m_cf_len cf_h_len) apply (simp add:s_cf_deg[THEN sym, of x], cut_tac ring_zero, frule aGroup.ag_inv_inj[of R x \<zero>], assumption+, simp only:aGroup.ag_inv_zero, subst s_cf_deg[THEN sym, of "-a x"], assumption+, simp add:deg_minus_eq) apply (simp add:cf_h_len PolynRg.m_cf_len, thin_tac "(polyn_expr A Y (fst (s_cf R S X (-a x))) (cf_h h (s_cf R S X (-a x))) = polyn_expr A Y (fst (s_cf R S X x)) (m_cf B (cf_h h (s_cf R S X x)))) = (∀j≤fst (s_cf R S X (-a x)). snd (cf_h h (s_cf R S X (-a x))) j = snd (m_cf B (cf_h h (s_cf R S X x))) j)") apply (rule allI, rule impI, subst m_cf_def) apply ((subst cf_h_def)+, simp add:cmp_def) apply (thin_tac "snd (s_cf R S X (-a x)) (fst (s_cf R S X (-a x))) ≠ \<zero>S", thin_tac "pol_coeff B (cf_h h (s_cf R S X (-a x)))", thin_tac "pol_coeff B (cf_h h (s_cf R S X x))", thin_tac "pol_coeff B (m_cf B (cf_h h (s_cf R S X x)))") apply (frule m_cf_pol_coeff[of "s_cf R S X x"]) apply (frule pol_expr_unique2[of "s_cf R S X (-a x)" "m_cf S (s_cf R S X x)"], assumption+, simp add:m_cf_len cf_h_len) apply (simp add:s_cf_deg[THEN sym, of x], cut_tac ring_zero, frule aGroup.ag_inv_inj[of R x \<zero>], assumption+, simp only:aGroup.ag_inv_zero, subst s_cf_deg[THEN sym, of "-a x"], assumption+, simp add:deg_minus_eq, simp add:m_cf_len) apply (drule_tac a = j in forall_spec, assumption, thin_tac "snd (s_cf R S X (-a x)) j = snd (m_cf S (s_cf R S X x)) j", thin_tac "polyn_expr R X (fst (s_cf R S X (-a x))) (s_cf R S X (-a x)) = polyn_expr R X (fst (s_cf R S X x)) (m_cf S (s_cf R S X x))") apply (cut_tac ring_zero, frule aGroup.ag_inv_inj[of R x \<zero>], assumption+, simp only:aGroup.ag_inv_zero, (simp add:s_cf_deg[THEN sym, of "-a x"] deg_minus_eq, simp add:s_cf_deg[of x]) ) apply (frule_tac j = j in pol_coeff_mem[of "s_cf R S X x"], assumption+) apply (subst m_cf_def, simp) apply (simp add:rHom_inv_inv) done lemma (in PolynRg) erHomTr1:"[|PolynRg A B Y; h ∈ rHom S B; a ∈ carrier R; b ∈ carrier R; a ≠ \<zero>; b ≠ \<zero>; a ± b ≠ \<zero>; deg_n R S X a = deg_n R S X b|] ==> erH R S X A B Y h (a ± b) = erH R S X A B Y h a ±A (erH R S X A B Y h b)" apply (cut_tac ring_is_ag, cut_tac subring, frule subring_Ring, frule PolynRg.subring[of A B Y], frule_tac x = a and y = b in aGroup.ag_pOp_closed[of "R"], assumption+, simp add:erH_def erh_def) apply (frule s_cf_expr[of a], assumption, frule s_cf_expr[of b], assumption, frule s_cf_expr[of "a ± b"], assumption, (erule conjE)+, simp add:s_cf_deg) apply (frule polyn_add1[of "s_cf R S X a" "s_cf R S X b"], assumption+) apply (cut_tac a = "a ± b" and b = "polyn_expr R X (fst (s_cf R S X (a ± b))) (s_cf R S X (a ± b))" and c = "polyn_expr R X (max (fst (s_cf R S X a)) (fst (s_cf R S X b))) (add_cf S (s_cf R S X a) (s_cf R S X b))" in box_equation, drule sym, drule sym, drule sym, simp, drule sym, drule sym, drule sym, simp, thin_tac "polyn_expr R X (fst (s_cf R S X a)) (s_cf R S X a) ± polyn_expr R X (fst (s_cf R S X b)) (s_cf R S X b) = polyn_expr R X (max (fst (s_cf R S X a)) (fst (s_cf R S X b))) (add_cf S (s_cf R S X a) (s_cf R S X b))", thin_tac "a = polyn_expr R X (fst (s_cf R S X b)) (s_cf R S X a)", thin_tac "b = polyn_expr R X (fst (s_cf R S X b)) (s_cf R S X b)", thin_tac "a ± b = polyn_expr R X (fst (s_cf R S X (a ± b))) (s_cf R S X (a ± b))") apply simp apply (frule cf_h_coeff[of A B Y h "s_cf R S X a"], assumption+, frule cf_h_coeff[of A B Y h "s_cf R S X b"], assumption+, frule cf_h_coeff[of A B Y h "s_cf R S X (a ± b)"], assumption+) apply (frule PolynRg.polyn_add1[of A B Y "cf_h h (s_cf R S X a)" "cf_h h (s_cf R S X b)"], assumption+, simp add:cf_h_len, thin_tac "polyn_expr A Y (fst (s_cf R S X b)) (cf_h h (s_cf R S X a)) ±A polyn_expr A Y (fst (s_cf R S X b)) (cf_h h (s_cf R S X b)) = polyn_expr A Y (fst (s_cf R S X b)) (add_cf B (cf_h h (s_cf R S X a)) (cf_h h (s_cf R S X b)))", frule PolynRg.add_cf_pol_coeff[of A B Y "cf_h h (s_cf R S X a)" "cf_h h (s_cf R S X b)"], assumption+) apply (case_tac "fst (s_cf R S X (a ±R b)) = fst (s_cf R S X b)") apply (frule PolynRg.pol_expr_unique2[of A B Y "cf_h h (s_cf R S X (a ± b))" "add_cf B (cf_h h (s_cf R S X a)) (cf_h h (s_cf R S X b))"], assumption+) apply (simp add:cf_h_len add_cf_len, simp add:PolynRg.add_cf_len cf_h_len) apply (simp add:PolynRg.add_cf_len cf_h_len, thin_tac "(polyn_expr A Y (fst (s_cf R S X b)) (cf_h h (s_cf R S X (a ± b))) = polyn_expr A Y (fst (s_cf R S X b)) (add_cf B (cf_h h (s_cf R S X a)) (cf_h h (s_cf R S X b)))) = (∀j≤fst (s_cf R S X b). snd (cf_h h (s_cf R S X (a ± b))) j = snd (add_cf B (cf_h h (s_cf R S X a)) (cf_h h (s_cf R S X b))) j)") apply (frule pol_expr_unique2[of "s_cf R S X (a ± b)" "add_cf S (s_cf R S X a) (s_cf R S X b)"]) apply (simp add:add_cf_pol_coeff) apply (simp add:add_cf_len, simp add:add_cf_len, thin_tac "polyn_expr R X (fst (s_cf R S X b)) (s_cf R S X (a ± b)) = polyn_expr R X (fst (s_cf R S X b)) (add_cf S (s_cf R S X a) (s_cf R S X b))") apply (rule allI, rule impI, drule_tac a = j in forall_spec, assumption, subst add_cf_def, simp add:cf_h_len, (subst cf_h_def)+, (subst cmp_def)+, simp, thin_tac "snd (s_cf R S X (a ± b)) j = snd (add_cf S (s_cf R S X a) (s_cf R S X b)) j") apply (subst add_cf_def, simp) apply (frule_tac j = j in pol_coeff_mem[of "s_cf R S X a"], simp, frule_tac j = j in pol_coeff_mem[of "s_cf R S X b"], simp, simp add:rHom_add) apply (frule s_cf_deg[of a], assumption, frule s_cf_deg[of b], assumption, frule s_cf_deg[of "a ± b"], assumption, frule deg_pols_add2[of a b], assumption+, simp add:deg_def, simp add:deg_def ale_natle, frule_tac m = "fst (s_cf R S X (a ± b))" and n = "fst (s_cf R S X b)" in noteq_le_less, assumption+) apply (frule pol_expr_unique3[of "s_cf R S X (a ± b)" "add_cf S (s_cf R S X a) (s_cf R S X b)"], simp add:add_cf_pol_coeff, simp add:add_cf_len, simp add:add_cf_len, thin_tac "polyn_expr R X (fst (s_cf R S X (a ± b))) (s_cf R S X (a ± b)) = polyn_expr R X (fst (s_cf R S X b)) (add_cf S (s_cf R S X a) (s_cf R S X b))") apply (frule PolynRg.pol_expr_unique3[of A B Y "cf_h h (s_cf R S X (a ± b))" "add_cf B (cf_h h (s_cf R S X a)) (cf_h h (s_cf R S X b))"], assumption+, simp add:cf_h_len PolynRg.add_cf_len, simp add:PolynRg.add_cf_len cf_h_len, thin_tac "(polyn_expr A Y (fst (s_cf R S X (a ± b))) (cf_h h (s_cf R S X (a ± b))) = polyn_expr A Y (fst (s_cf R S X b)) (add_cf B (cf_h h (s_cf R S X a)) (cf_h h (s_cf R S X b)))) = ((∀j≤fst (s_cf R S X (a ± b)). snd (cf_h h (s_cf R S X (a ± b))) j = snd (add_cf B (cf_h h (s_cf R S X a)) (cf_h h (s_cf R S X b))) j) ∧ (∀j∈nset (Suc (fst (s_cf R S X (a ± b)))) (fst (s_cf R S X b)). snd (add_cf B (cf_h h (s_cf R S X a)) (cf_h h (s_cf R S X b))) j = \<zero>B))", thin_tac "pol_coeff B (cf_h h (s_cf R S X a))", thin_tac "pol_coeff B (cf_h h (s_cf R S X b))", thin_tac "pol_coeff B (cf_h h (s_cf R S X (a ± b)))", thin_tac "pol_coeff B (add_cf B (cf_h h (s_cf R S X a)) (cf_h h (s_cf R S X b)))", thin_tac "deg_n R S X a = fst (s_cf R S X b)", thin_tac "deg_n R S X b = fst (s_cf R S X b)", thin_tac "deg_n R S X (a ± b) = fst (s_cf R S X (a ± b))") apply (rule conjI, erule conjE, thin_tac "∀j∈nset (Suc (fst (s_cf R S X (a ± b)))) (fst (s_cf R S X b)). snd (add_cf S (s_cf R S X a) (s_cf R S X b)) j = \<zero>S") apply (rule allI, rule impI, drule_tac a = j in forall_spec, assumption, (subst cf_h_def)+, (subst cmp_def)+, simp, (subst add_cf_def)+, simp, frule_tac j = j in pol_coeff_mem[of "s_cf R S X a"], simp, frule_tac j = j in pol_coeff_mem[of "s_cf R S X b"], simp, simp add:rHom_add) apply (erule conjE, thin_tac "∀j≤fst (s_cf R S X (a ± b)). snd (s_cf R S X (a ± b)) j = snd (add_cf S (s_cf R S X a) (s_cf R S X b)) j") apply (rule ballI, drule_tac b = j in forball_spec1, assumption, simp add:add_cf_def cf_h_len, simp add:cf_h_def cmp_def, frule_tac j = j in pol_coeff_mem[of "s_cf R S X a"], simp add:nset_def, frule_tac j = j in pol_coeff_mem[of "s_cf R S X b"], simp add:nset_def) apply (subst rHom_add[THEN sym, of h S B], assumption+, simp, (frule PolynRg.is_Ring[of A B Y], frule Ring.subring_Ring[of A B], assumption), simp add:rHom_0_0[of S B]) done lemma (in PolynRg) erHomTr2:"[|PolynRg A B Y; h ∈ rHom S B; a ∈ carrier R; b ∈ carrier R; a ≠ \<zero>; b ≠ \<zero>; a ± b ≠ \<zero>; deg_n R S X a < deg_n R S X b|] ==> erH R S X A B Y h (a ± b) = erH R S X A B Y h a ±A (erH R S X A B Y h b)" apply (cut_tac ring_is_ag, cut_tac subring, frule subring_Ring, frule PolynRg.subring[of A B Y], frule_tac x = a and y = b in aGroup.ag_pOp_closed[of "R"], assumption+, simp add:erH_def erh_def) apply (frule s_cf_expr[of a], assumption, frule s_cf_expr[of b], assumption, frule s_cf_expr[of "a ± b"], assumption, (erule conjE)+, frule polyn_deg_add1[of a b], assumption+, simp add:s_cf_deg) apply (frule polyn_add1[of "s_cf R S X a" "s_cf R S X b"], assumption+) apply (cut_tac a = "a ± b" and b = "polyn_expr R X (fst (s_cf R S X b)) (s_cf R S X (a ± b))" and c = "polyn_expr R X (max (fst (s_cf R S X a)) (fst (s_cf R S X b))) (add_cf S (s_cf R S X a) (s_cf R S X b))" in box_equation, drule sym, drule sym, drule sym, simp, drule sym, drule sym, drule sym, simp, thin_tac "polyn_expr R X (fst (s_cf R S X a)) (s_cf R S X a) ± polyn_expr R X (fst (s_cf R S X b)) (s_cf R S X b) = polyn_expr R X (max (fst (s_cf R S X a)) (fst (s_cf R S X b))) (add_cf S (s_cf R S X a) (s_cf R S X b))", thin_tac "a = polyn_expr R X (fst (s_cf R S X a)) (s_cf R S X a)", thin_tac "b = polyn_expr R X (fst (s_cf R S X b)) (s_cf R S X b)", thin_tac "a ± b = polyn_expr R X (fst (s_cf R S X b)) (s_cf R S X (a ± b))", simp add:max_def) apply (frule cf_h_coeff[of A B Y h "s_cf R S X a"], assumption+, frule cf_h_coeff[of A B Y h "s_cf R S X b"], assumption+, frule cf_h_coeff[of A B Y h "s_cf R S X (a ± b)"], assumption+) apply (frule PolynRg.polyn_add1[of A B Y "cf_h h (s_cf R S X a)" "cf_h h (s_cf R S X b)"], assumption+, simp add:cf_h_len, simp add:max_def) apply (thin_tac "polyn_expr A Y (fst (s_cf R S X a)) (cf_h h (s_cf R S X a)) ±A polyn_expr A Y (fst (s_cf R S X b)) (cf_h h (s_cf R S X b)) = polyn_expr A Y (fst (s_cf R S X b)) (add_cf B (cf_h h (s_cf R S X a)) (cf_h h (s_cf R S X b)))", frule PolynRg.add_cf_pol_coeff[of A B Y "cf_h h (s_cf R S X a)" "cf_h h (s_cf R S X b)"], assumption+) apply (frule PolynRg.pol_expr_unique2[of A B Y "cf_h h (s_cf R S X (a ± b))" "add_cf B (cf_h h (s_cf R S X a)) (cf_h h (s_cf R S X b))"], assumption+, simp add:cf_h_len add_cf_len, simp add:PolynRg.add_cf_len cf_h_len max_def, simp add:PolynRg.add_cf_len cf_h_len max_def, thin_tac "(polyn_expr A Y (fst (s_cf R S X b)) (cf_h h (s_cf R S X (a ± b))) = polyn_expr A Y (fst (s_cf R S X b)) (add_cf B (cf_h h (s_cf R S X a)) (cf_h h (s_cf R S X b)))) = (∀j≤fst (s_cf R S X b). snd (cf_h h (s_cf R S X (a ± b))) j = snd (add_cf B (cf_h h (s_cf R S X a)) (cf_h h (s_cf R S X b))) j)") apply (frule pol_expr_unique2[of "s_cf R S X (a ± b)" "add_cf S (s_cf R S X a) (s_cf R S X b)"], simp add:add_cf_pol_coeff, simp add:add_cf_len max_def, simp add:add_cf_len max_def) apply (thin_tac "polyn_expr R X (fst (s_cf R S X b)) (s_cf R S X (a ± b)) = polyn_expr R X (fst (s_cf R S X b)) (add_cf S (s_cf R S X a) (s_cf R S X b))") apply (rule allI, rule impI, drule_tac a = j in forall_spec, assumption, subst add_cf_def, simp add:cf_h_len, (subst cf_h_def)+, (subst cmp_def)+, simp, subst add_cf_def, simp) apply (case_tac "j ≤ fst (s_cf R S X a)", simp) apply (frule_tac j = j in pol_coeff_mem[of "s_cf R S X a"], simp, frule_tac j = j in pol_coeff_mem[of "s_cf R S X b"], simp, simp add:rHom_add) apply simp apply (subst add_cf_def, simp) done lemma (in PolynRg) erH_rHom:"[|Idomain S; PolynRg A B Y; h ∈ rHom S B|] ==> erH R S X A B Y h ∈ pHom R S X, A B Y" apply (frule Idomain.idom_is_ring[of "S"], cut_tac subring, cut_tac polyn_ring_integral, simp, frule PolynRg.subring[of A B Y], frule PolynRg.is_Ring[of A B Y], frule Ring.subring_Ring[of A B], assumption) apply (simp add:polyn_Hom_def, rule conjI) prefer 2 apply (cut_tac polyn_ring_X_nonzero, cut_tac X_mem_R, rule conjI, rule subsetI, simp add:image_def, erule bexE) apply (case_tac "xa = \<zero>S", simp add:Subring_zero_ring_zero, simp add:erH_rHom_0, simp add:Ring.Subring_zero_ring_zero[THEN sym, of A B], simp add:Ring.ring_zero[of B]) apply (simp add:Subring_zero_ring_zero, frule_tac x = xa in mem_subring_mem_ring, assumption, frule_tac p = xa in s_cf_expr, assumption+, (erule conjE)+, frule_tac p1 = xa in s_cf_deg[THEN sym], assumption+, frule_tac p1 = xa in pol_of_deg0[THEN sym], assumption+, simp) apply (simp add:erH_def erh_def, subst polyn_expr_def, simp, frule_tac c = "s_cf R S X xa" in cf_h_coeff[of A B Y h], assumption+, frule_tac c = "cf_h h (s_cf R S X xa)" and j = 0 in PolynRg.pol_coeff_mem[of A B Y], assumption, simp, frule_tac c = "cf_h h (s_cf R S X xa)" and j = 0 in PolynRg.pol_coeff_mem_R[of A B Y], assumption, simp, simp add:Ring.ring_r_one[of A]) apply (cut_tac pol_expr_of_X, cut_tac special_cf_pol_coeff, frule ext_cf_pol_coeff[of "C0 S" "Suc 0"]) apply (simp add:erH_def erh_def) apply (cut_tac deg_n_of_X) apply (frule s_cf_expr[of X], assumption+, (erule conjE)+, frule_tac a = X and b = "polyn_expr R X (Suc 0) (ext_cf S (Suc 0) (C0 S))" and c = "polyn_expr R X (fst (s_cf R S X X)) (s_cf R S X X)" in box_equation, assumption+, thin_tac "X = polyn_expr R X (Suc 0) (ext_cf S (Suc 0) (C0 S))", thin_tac "X = polyn_expr R X (fst (s_cf R S X X)) (s_cf R S X X)") apply (rule sym, subst PolynRg.pol_expr_of_X[of A B Y], assumption+, frule s_cf_deg[of X], assumption+, simp) apply (frule pol_expr_unique2[of "ext_cf S (Suc 0) (C0 S)" "s_cf R S X X"], assumption+, simp add:ext_cf_len special_cf_len, simp add:ext_cf_len special_cf_len) apply (frule cf_h_coeff[of A B Y h "ext_cf S (Suc 0) (C0 S)"], assumption+, frule cf_h_coeff[of A B Y h "s_cf R S X X"], assumption+) apply (frule PolynRg.pol_expr_unique2[of A B Y "cf_h h (ext_cf S (Suc 0) (C0 S))" "cf_h h (s_cf R S X X)"], assumption+, simp add:cf_h_len ext_cf_len special_cf_len, simp add:cf_h_len ext_cf_len special_cf_len) apply (simp add:cf_h_special_cf) apply (thin_tac "(polyn_expr A Y (Suc 0) (ext_cf B (Suc 0) (C0 B)) = polyn_expr A Y (Suc 0) (cf_h h (s_cf R S X X))) = (∀j≤Suc 0. snd (cf_h h (ext_cf S (Suc 0) (C0 S))) j = snd (cf_h h (s_cf R S X X)) j)") apply (rule allI, rule impI, drule_tac a = j in forall_spec, assumption, (subst cf_h_def)+, (subst cmp_def)+, simp) apply (subst rHom_def, simp, cut_tac ring_is_ag, frule Ring.ring_is_ag[of A]) apply (rule conjI) apply (subst aHom_def, simp) apply (rule conjI) apply (rule univar_func_test, rule ballI) apply (simp add:erH_mem) apply (rule conjI, simp add:erH_def erh_def extensional_def) apply (rule ballI)+ apply (case_tac "a = \<zero>R", case_tac "b = \<zero>R", simp) apply (simp add:erH_rHom_0, frule Ring.ring_is_ag[of A], frule Ring.ring_zero[of A], simp add:aGroup.ag_r_zero) apply (simp add:erH_rHom_0, simp add:erH_rHom_0) apply (frule_tac p = b in erH_mem[of A B Y h], assumption+) apply (simp add:aGroup.ag_l_zero) apply (case_tac "b = \<zero>R", simp) apply (simp add:erH_rHom_0, frule_tac p = a in erH_mem[of A B Y h], assumption+, simp add:aGroup.ag_r_zero) apply (case_tac "a ±R b = \<zero>R", simp add:erH_rHom_0) apply (frule_tac x = a and y = b in aGroup.ag_inv_unique[of R], assumption+, simp, thin_tac "b = -a a") apply (subst erHomTr0[of A B Y h], assumption+, frule_tac p = a in erH_mem[of A B Y h], assumption+, simp add:aGroup.ag_r_inv1) apply (case_tac "deg_n R S X a = deg_n R S X b", simp add:erHomTr1[of A B Y h]) apply (cut_tac y = "deg_n R S X a" and x = "deg_n R S X b" in less_linear, simp) apply (erule disjE) apply (subst aGroup.ag_pOp_commute, assumption+, frule_tac p = a in erH_mem[of A B Y h], assumption+, frule_tac p = b in erH_mem[of A B Y h], assumption+, subst aGroup.ag_pOp_commute[of A], assumption+, rule erHomTr2[of A B Y h], assumption+, simp add:aGroup.ag_pOp_commute, assumption) apply(rule erHomTr2[of A B Y h], assumption+) apply (simp add:erH_rHomTr2) apply (rule ballI)+ apply (case_tac "x = \<zero>R", simp add:ring_times_0_x erH_rHom_0, frule_tac p = y in erH_mem[of A B Y h], assumption+, simp add:Ring.ring_times_0_x[of A]) apply (case_tac "y = \<zero>R", simp add:ring_times_x_0 erH_rHom_0, frule_tac p = x in erH_mem[of A B Y h], assumption+, simp add:Ring.ring_times_x_0[of A]) apply (frule_tac p = x in s_cf_expr, assumption+, frule_tac p = y in s_cf_expr, assumption+, frule_tac x = x and y = y in ring_tOp_closed, assumption+, frule_tac p = "x ·r y" in s_cf_expr, simp add:Idomain.idom_tOp_nonzeros, (erule conjE)+) apply (frule_tac c = "s_cf R S X x" and d = "s_cf R S X y" in polyn_expr_tOp_c, assumption+, erule exE, (erule conjE)+, cut_tac a = "x ·r y" and b = "polyn_expr R X (fst (s_cf R S X (x ·r y))) (s_cf R S X (x ·r y))" and c = "polyn_expr R X (fst e) e" in box_equation) apply assumption apply (thin_tac "x ·r y = polyn_expr R X (fst (s_cf R S X (x ·r y))) (s_cf R S X (x ·r y))") apply (drule sym, drule sym, simp) apply (thin_tac "x = polyn_expr R X (fst (s_cf R S X x)) (s_cf R S X x)", thin_tac "y = polyn_expr R X (fst (s_cf R S X y)) (s_cf R S X y)", thin_tac "x ·r y = polyn_expr R X (fst (s_cf R S X (x ·r y))) (s_cf R S X (x ·r y))") apply ((subst erH_def)+, (subst erh_def)+, simp) apply (frule_tac c = "s_cf R S X x" and d = "s_cf R S X y" and e = e in erH_multTr1[of A B Y h], assumption+, simp, simp, thin_tac "polyn_expr A Y (fst (s_cf R S X x)) (cf_h h (s_cf R S X x)) ·rA polyn_expr A Y (fst (s_cf R S X y)) (cf_h h (s_cf R S X y)) = polyn_expr A Y (fst (s_cf R S X x) + fst (s_cf R S X y)) (cf_h h e)") apply (rotate_tac -1, drule sym, simp, thin_tac "polyn_expr R X (fst (s_cf R S X x)) (s_cf R S X x) ·r polyn_expr R X (fst (s_cf R S X y)) (s_cf R S X y) = polyn_expr R X (fst (s_cf R S X (x ·r y))) (s_cf R S X (x ·r y))", rotate_tac -1, drule sym) apply (frule_tac p = x in s_cf_deg, assumption, frule_tac p = y in s_cf_deg, assumption, frule_tac x = x and y = y in Idomain.idom_tOp_nonzeros[of R], assumption+, frule_tac p = "x ·r y" in s_cf_deg, assumption+) apply (frule_tac p = x and q = y in deg_mult_pols, assumption+, (erule conjE)+, simp, thin_tac "deg_n R S X x = fst (s_cf R S X x)", thin_tac "deg_n R S X y = fst (s_cf R S X y)", thin_tac "deg_n R S X (x ·r y) = fst (s_cf R S X (x ·r y))", rotate_tac -2, drule sym) apply (simp add:cf_h_len) apply (frule_tac c = "s_cf R S X (x ·r y)" in cf_h_coeff[of A B Y h], assumption+, frule_tac c = e in cf_h_coeff[of A B Y h], assumption+) apply (frule_tac c = "cf_h h (s_cf R S X (x ·r y))" and d = "cf_h h e" in PolynRg.pol_expr_unique2[of A B Y], assumption+, simp add:cf_h_len, simp add:cf_h_len, thin_tac "(polyn_expr A Y (fst (s_cf R S X x) + fst (s_cf R S X y)) (cf_h h (s_cf R S X (x ·r y))) = polyn_expr A Y (fst (s_cf R S X x) + fst (s_cf R S X y)) (cf_h h e)) = (∀j≤fst (s_cf R S X x) + fst (s_cf R S X y). snd (cf_h h (s_cf R S X (x ·r y))) j = snd (cf_h h e) j)") apply (frule_tac c = "s_cf R S X (x ·r y)" and d = e in pol_expr_unique2, assumption+, simp, simp, thin_tac "polyn_expr R X (fst (s_cf R S X x) + fst (s_cf R S X y)) (s_cf R S X (x ·r y)) = polyn_expr R X (fst (s_cf R S X x) + fst (s_cf R S X y)) e") apply (rule allI, rule impI, drule_tac a = j in forall_spec, assumption, subst cf_h_def, subst cmp_def, simp, subst cf_h_def, subst cmp_def, simp) done lemma (in PolynRg) erH_q_rHom:"[|Idomain S; maximal_ideal S P; PolynRg R' (S /r P) Y|] ==> erH R S X R' (S /r P) Y (pj S P) ∈ pHom R S X, R' (S /r P) Y" apply (frule Idomain.idom_is_ring[of "S"], frule Ring.qring_ring[of S P], simp add:Ring.maximal_ideal_ideal, rule erH_rHom[of R' "S /r P" Y "pj S P"], assumption+) apply (rule pj_Hom[of S P], assumption+, simp add:Ring.maximal_ideal_ideal) done lemma (in PolynRg) erH_add:"[|Idomain S; PolynRg A B Y; h ∈ rHom S B; p ∈ carrier R; q ∈ carrier R|] ==> erH R S X A B Y h (p ± q) = (erH R S X A B Y h p) ±A (erH R S X A B Y h q)" apply (frule erH_rHom[of A B Y h], assumption+) apply (simp add:polyn_Hom_def, (erule conjE)+) apply (simp add:rHom_add) done lemma (in PolynRg) erH_minus:"[|Idomain S; PolynRg A B Y; h ∈ rHom S B; p ∈ carrier R|] ==> erH R S X A B Y h (-a p) = -aA (erH R S X A B Y h p)" apply (frule erH_rHom[of A B Y h], assumption+, simp add:polyn_Hom_def, (erule conjE)+) apply (frule PolynRg.is_Ring[of A B Y]) apply (rule rHom_inv_inv[of R A p "erH R S X A B Y h"]) apply (cut_tac is_Ring, assumption+) done lemma (in PolynRg) erH_mult:"[|Idomain S; PolynRg A B Y; h ∈ rHom S B; p ∈ carrier R; q ∈ carrier R|] ==> erH R S X A B Y h (p ·r q) = (erH R S X A B Y h p) ·rA (erH R S X A B Y h q)" apply (frule erH_rHom[of A B Y h], assumption+, simp add:polyn_Hom_def, (erule conjE)+, frule PolynRg.is_Ring[of A B Y], cut_tac is_Ring, rule rHom_tOp[of R A p q "erH R S X A B Y h"], assumption+) done lemma (in PolynRg) erH_rHom_cf:"[|Idomain S; PolynRg A B Y; h ∈ rHom S B; s ∈ carrier S|] ==> erH R S X A B Y h s = h s" apply (cut_tac subring, frule subring_Ring, frule PolynRg.subring[of A B Y], frule PolynRg.is_Ring[of A B Y], frule Ring.subring_Ring[of A B], assumption, frule mem_subring_mem_ring[of S s], assumption+) apply (case_tac "s = \<zero>S", simp add:Subring_zero_ring_zero, simp add:erH_rHom_0, simp add:Subring_zero_ring_zero[THEN sym], simp add:rHom_0_0, simp add:Ring.Subring_zero_ring_zero) apply (frule s_cf_expr[of s],simp add:Subring_zero_ring_zero, (erule conjE)+, simp add:Subring_zero_ring_zero) apply (frule s_cf_deg[of s], assumption+, frule pol_of_deg0[of s], assumption+, simp) apply (subst erH_def, simp, subst erh_rHom_coeff[of A B Y h "s_cf R S X s"], assumption+, simp add:cmp_def polyn_expr_def, frule_tac c = "s_cf R S X s" and j = 0 in pol_coeff_mem, simp, frule mem_subring_mem_ring[of S "snd (s_cf R S X s) 0"], assumption+, simp add:ring_r_one) done lemma (in PolynRg) erH_rHom_coeff:"[|Idomain S; PolynRg A B Y; h ∈ rHom S B; pol_coeff S (n, f)|] ==> pol_coeff B (n, cmp h f)" apply (simp add:pol_coeff_def) apply (rule allI, rule impI, drule_tac a = j in forall_spec, assumption) apply (simp add:cmp_def rHom_mem) done lemma (in PolynRg) erH_rHom_unique:"[|Idomain S; PolynRg A B Y; h ∈ rHom S B|] ==> ∃!g. g ∈ pHom R S X, A B Y ∧ (∀x∈carrier S. h x = g x)" apply (cut_tac subring, frule subring_Ring, cut_tac is_Ring, frule PolynRg.subring[of A B Y], frule PolynRg.is_Ring[of A B Y], frule Ring.subring_Ring[of A B], assumption, frule Idomain.idom_is_ring[of S]) apply (rule ex_ex1I) apply (frule erH_rHom[of A B Y h], assumption+) apply (subgoal_tac "∀x∈carrier S. h x = (erH R S X A B Y h) x", blast) apply (rule ballI, simp add:erH_rHom_cf, (erule conjE)+) apply (frule pHom_rHom[of A B Y], assumption+, frule pHom_rHom[of A B Y], assumption+, frule_tac f = g in rHom_func[of _ R A], frule_tac f = y in rHom_func[of _ R A]) apply (rule_tac f = g and g = y in funcset_eq[of _ "carrier R"], simp add:rHom_def aHom_def, simp add:rHom_def aHom_def) apply (rule ballI, thin_tac "g ∈ carrier R -> carrier A", thin_tac "y ∈ carrier R -> carrier A") apply (case_tac "x = \<zero>R", simp, subst rHom_0_0[of R A], assumption+, rule sym, subst rHom_0_0[of R A], assumption+, simp) apply (subst pHom_pol_mem[of A B Y], assumption+) apply (frule_tac f = y and p = x in pHom_pol_mem[of A B Y], assumption+, simp, frule_tac f = g and c = "s_cf R S X x" in polyn_Hom_coeff_to_coeff, assumption+, simp add:s_cf_pol_coeff, frule_tac f = y and c = "s_cf R S X x" in polyn_Hom_coeff_to_coeff, assumption+, simp add:s_cf_pol_coeff) apply (simp add:s_cf_deg) apply (frule_tac f = g and c = "s_cf R S X x" in cf_h_len1[of A B Y h], assumption+, rule ballI, rule sym, simp, rule s_cf_pol_coeff, assumption+) apply (frule_tac f = y and c = "s_cf R S X x" in cf_h_len1[of A B Y h], assumption+, rule ballI, rule sym, simp, rule s_cf_pol_coeff, assumption+) apply (frule_tac c = "cf_h g (s_cf R S X x)" and d = "cf_h y (s_cf R S X x)" in PolynRg.pol_expr_unique2[of A B Y], assumption+, simp) apply (frule_tac p = x in s_cf_pol_coeff, simp add:cf_h_len, thin_tac "(polyn_expr A Y (fst (s_cf R S X x)) (cf_h g (s_cf R S X x)) = polyn_expr A Y (fst (s_cf R S X x)) (cf_h y (s_cf R S X x))) = (∀j≤fst (s_cf R S X x). snd (cf_h g (s_cf R S X x)) j = snd (cf_h y (s_cf R S X x)) j)") apply (rule allI, rule impI, (subst cf_h_def)+, (subst cmp_def)+, simp, frule_tac c = "s_cf R S X x" and j = j in pol_coeff_mem, assumption+) apply simp done lemma (in PolynRg) erH_rHom_unique1:"[|Idomain S; PolynRg A B Y; h ∈ rHom S B; f ∈ pHom R S X, A B Y; ∀x ∈ carrier S. f x = h x|] ==> f = (erH R S X A B Y h)" apply (frule erH_rHom_unique[of A B Y h], assumption+, erule ex1E, frule_tac a = f in forall_spec1, drule_tac a = "erH R S X A B Y h" in forall_spec1) apply (frule erH_rHom[of A B Y h], assumption+, simp add:erH_rHom_cf[THEN sym]) done lemma (in PolynRg) pHom_dec_deg:"[|PolynRg A B Y; f ∈ pHom R S X, A B Y; p ∈ carrier R|] ==> deg A B Y (f p) ≤ deg R S X p" apply (cut_tac subring, frule subring_Ring, frule PolynRg.subring[of A B Y], cut_tac is_Ring) apply (frule PolynRg.is_Ring[of A B Y], frule Ring.subring_Ring[of A B], assumption) apply (case_tac "f p = \<zero>A", case_tac "p = \<zero>R", simp add:deg_def, simp add:deg_def an_def, simp add:deg_def, subst ale_natle) apply (case_tac "p = \<zero>R", frule pHom_rHom[of A B Y f], assumption+, rule conjI, rule impI, frule rHom_0_0[of R A f], assumption+, simp, rule impI, simp) apply simp apply (frule pHom_pol_mem[of A B Y f p], assumption+) apply (cut_tac polyn_Hom_coeff_to_coeff[of A B Y f "s_cf R S X p"]) apply (frule PolynRg.pol_deg_le_n[of A B Y "f p" "cf_h f (s_cf R S X p)"], frule pHom_rHom[of A B Y f], assumption+, rule rHom_mem[of f R A p], assumption+, frule s_cf_pol_coeff[of p], subst cf_h_len2[of A B Y f "s_cf R S X p"], assumption+, simp add:s_cf_deg, thin_tac "f p = polyn_expr A Y (deg_n R S X p) (cf_h f (s_cf R S X p))") apply (frule s_cf_pol_coeff[of p], simp add:cf_h_len2, simp add:s_cf_deg[THEN sym], assumption+, simp add:s_cf_pol_coeff) done lemma (in PolynRg) erH_map:"[|Idomain S; PolynRg A B Y; h ∈ rHom S B; pol_coeff S (n, c)|] ==> (erH R S X A B Y h) (polyn_expr R X n (n, c)) = polyn_expr A Y n (n, (cmp h c))" apply (cut_tac subring, frule subring_Ring, frule PolynRg.subring[of A B Y], cut_tac is_Ring, frule PolynRg.is_Ring[of A B Y], frule Ring.subring_Ring[of A B], assumption) apply (case_tac "polyn_expr R X n (n, c) = \<zero>R", simp add:erH_rHom_0) apply (frule coeff_0_pol_0[THEN sym, of "(n, c)" n], simp, simp, thin_tac "polyn_expr R X n (n, c) = \<zero>") apply (frule cf_h_coeff[of A B Y h "(n, c)"], assumption+, simp add:cf_h_pol_coeff) apply (rule sym, frule_tac PolynRg.coeff_0_pol_0[THEN sym, of A B Y "(n, cmp h c)" n], simp+) apply (rule allI, rule impI, simp add:cmp_def, simp add:rHom_0_0) apply (frule erH_rHom[of A B Y h], assumption+) apply (subst pHom_mem[of A B Y "erH R S X A B Y h" n c], assumption+) apply (frule PolynRg.pol_expr_unique2[of A B Y "(n, cmp (erH R S X A B Y h) c)" "(n, cmp h c)"], simp add:cmp_pol_coeff_e, simp add:cmp_pol_coeff) apply (simp, simp, thin_tac "(polyn_expr A Y n (n, cmp (erH R S X A B Y h) c) = polyn_expr A Y n (n, cmp h c)) = (∀j≤n. cmp (erH R S X A B Y h) c j = cmp h c j)") apply (rule allI, rule impI, frule_tac j = j in pol_coeff_mem[of "(n, c)"], simp, simp add:cmp_def) apply (simp add:erH_rHom_cf) done section "16. relatively prime polynomials" constdefs rel_prime_pols::"[('a, 'm) Ring_scheme, ('a, 'm1) Ring_scheme, 'a, 'a, 'a ] => bool" "rel_prime_pols R S X p q == (1rR) ∈ ((Rxa R p) \<minusplus>R (Rxa R q))" constdefs div_condn::"[('a, 'm) Ring_scheme, ('a, 'm1) Ring_scheme, 'a, nat, 'a, 'a ] => bool" "div_condn R S X n g f == f ∈ carrier R ∧ n = deg_n R S X f --> (∃q. q ∈ carrier R ∧ ((f ±R (-aR (q ·rR g)) = \<zero>R) ∨ (deg_n R S X (f ±R (-aR (q ·rR g))) < deg_n R S X g)))" lemma (in PolynRg) divisionTr0:"[|Idomain S; p ∈ carrier R; c ∈ carrier S; c ≠ \<zero>S|] ==> lcf R S X (c ·r X^R n ·r p) = c ·rS (lcf R S X p)" apply (cut_tac polyn_ring_integral, simp, cut_tac subring, frule subring_Ring, cut_tac polyn_ring_X_nonzero, cut_tac X_mem_R) apply (frule mem_subring_mem_ring[of S c], assumption+, frule npClose[of X n]) apply (case_tac "p = \<zero>R", simp, frule ring_tOp_closed[of c "X^R n"], assumption+, simp add:ring_times_x_0 lcf_val_0, simp add:Ring.ring_times_x_0[of S]) apply (frule_tac x = c and y = " X^R n" in Idomain.idom_tOp_nonzeros[of R], assumption+, simp add:Subring_zero_ring_zero, frule Idomain.idom_potent_nonzero[of R X n], assumption+, frule_tac x = c and y = " X^R n" in ring_tOp_closed, assumption+, frule_tac x = "c ·r X^R n" and y = p in Idomain.idom_tOp_nonzeros[of R], assumption+, frule_tac x = "c ·r X^R n" and y = p in ring_tOp_closed, assumption+) apply (simp add:lcf_val) apply (frule s_cf_expr[of p], assumption, (erule conjE)+, simp add:ring_tOp_assoc[of c _ p], frule low_deg_terms_zero1[THEN sym, of "s_cf R S X p" n]) apply (cut_tac a = "X^R n ·r polyn_expr R X (fst (s_cf R S X p)) (s_cf R S X p)" and b = "X^R n ·r p" and c = "polyn_expr R X (fst (s_cf R S X p) + n) (ext_cf S n (s_cf R S X p))" in box_equation, simp, assumption, thin_tac "p = polyn_expr R X (fst (s_cf R S X p)) (s_cf R S X p)", thin_tac "X^R n ·r polyn_expr R X (fst (s_cf R S X p)) (s_cf R S X p) = polyn_expr R X (fst (s_cf R S X p) + n) (ext_cf S n (s_cf R S X p))") apply (frule ext_cf_pol_coeff[of "s_cf R S X p" n], frule scalar_times_pol_expr[of c "ext_cf S n (s_cf R S X p)" "fst (s_cf R S X p) + n"], assumption+, simp add:ext_cf_len) apply (frule sp_cf_pol_coeff[of "ext_cf S n (s_cf R S X p)" c], assumption+, cut_tac a = "c ·r polyn_expr R X (fst (s_cf R S X p) + n) (ext_cf S n (s_cf R S X p))" and b = "c ·r (X^R n ·r p)" and c = "polyn_expr R X (fst (s_cf R S X p) + n) (sp_cf S c (ext_cf S n (s_cf R S X p)))" in box_equation, simp, simp, thin_tac "X^R n ·r p = polyn_expr R X (fst (s_cf R S X p) + n) (ext_cf S n (s_cf R S X p))", thin_tac "c ·r polyn_expr R X (fst (s_cf R S X p) + n) (ext_cf S n (s_cf R S X p)) = polyn_expr R X (fst (s_cf R S X p) + n) (sp_cf S c (ext_cf S n (s_cf R S X p)))") apply (frule s_cf_expr[of "c ·r (X^R n ·r p)"], assumption+, (erule conjE)+, drule_tac a = "c ·r (X^R n ·r p)" and b = "polyn_expr R X (fst (s_cf R S X (c ·r (X^R n ·r p)))) (s_cf R S X (c ·r (X^R n ·r p)))" and c = "polyn_expr R X (fst (s_cf R S X p) + n) (sp_cf S c (ext_cf S n (s_cf R S X p)))" in box_equation, assumption, thin_tac "c ·r (X^R n ·r p) = polyn_expr R X (fst (s_cf R S X p) + n) (sp_cf S c (ext_cf S n (s_cf R S X p)))", frule pol_expr_unique2[of "s_cf R S X (c ·r (X^R n ·r p))" "sp_cf S c (ext_cf S n (s_cf R S X p))"], assumption+, subst s_cf_deg[THEN sym], assumption+, frule_tac Idomain.idom_potent_nonzero[of R X n], assumption+, frule_tac x = "X^R n" and y = p in Idomain.idom_tOp_nonzeros[of R], assumption+) apply (subst deg_mult_pols, assumption+, simp add:Subring_zero_ring_zero, simp add:ring_tOp_closed, assumption+, subst deg_mult_pols, assumption+, simp add:deg_to_X_d, cut_tac pol_of_deg0[THEN sym, of c], simp, simp add:sp_cf_len ext_cf_len s_cf_deg, assumption+, simp add:Subring_zero_ring_zero, simp add:sp_cf_len ext_cf_len) apply (subst s_cf_deg[THEN sym], assumption+, frule_tac Idomain.idom_potent_nonzero[of R X n], assumption+, frule_tac x = "X^R n" and y = p in Idomain.idom_tOp_nonzeros[of R], assumption+, simp add:s_cf_deg[THEN sym], frule_tac x = "X^R n" and y = p in ring_tOp_closed, assumption+) apply (frule deg_mult_pols[of c "X^R n ·r p"], assumption+, simp add:Subring_zero_ring_zero, assumption+, (erule conjE)+, simp, thin_tac "deg_n R S X (c ·r (X^R n ·r p)) = deg_n R S X c + deg_n R S X (X^R n ·r p)", cut_tac pol_of_deg0[THEN sym, of c], simp, frule deg_mult_pols[of "X^R n" p], assumption+, (erule conjE)+, simp, thin_tac "deg_n R S X (X^R n ·r p) = deg_n R S X (X^R n) + deg_n R S X p", simp add:deg_to_X_d, simp add:add_commute[of n], thin_tac "polyn_expr R X (deg_n R S X p + n) (s_cf R S X (c ·r (X^R n ·r p))) = polyn_expr R X (deg_n R S X p + n) (sp_cf S c (ext_cf S n (s_cf R S X p)))") apply (subst sp_cf_def, simp) apply (subst ext_cf_def, simp add:sliden_def, assumption) apply (simp add:Subring_zero_ring_zero) done lemma (in PolynRg) divisionTr1:"[|Corps S; g ∈ carrier R; g ≠ \<zero>; 0 < deg_n R S X g; f ∈ carrier R; f ≠ \<zero>; deg_n R S X g ≤ deg_n R S X f|] ==> f ± -a ((lcf R S X f) ·rS ((lcf R S X g) S) ·r (X^R ((deg_n R S X f) - (deg_n R S X g))) ·r g) = \<zero> ∨ deg_n R S X (f ± -a ((lcf R S X f) ·rS ((lcf R S X g) S) ·r (X^R ((deg_n R S X f) - (deg_n R S X g))) ·r g)) < deg_n R S X f" apply (cut_tac ring_is_ag, cut_tac subring, frule Corps.field_is_idom[of "S"], frule subring_Ring, cut_tac subring, cut_tac polyn_ring_X_nonzero, cut_tac X_mem_R, cut_tac polyn_ring_integral, simp) apply (frule npClose[of X "deg_n R S X f - deg_n R S X g"], frule_tac Idomain.idom_potent_nonzero[of R X "fst (s_cf R S X f) - fst (s_cf R S X g)"], assumption+, frule s_cf_expr[of f], assumption+, (erule conjE)+, frule s_cf_expr[of g], assumption+, (erule conjE)+, simp add:s_cf_deg, simp add:lcf_val[THEN sym], frule Corps.invf_closed1[of S "lcf R S X g"], simp, simp add:lcf_mem, frule lcf_mem[of f], simp, frule subring_Ring, frule Ring.ring_is_ag[of S], (erule conjE)+, frule_tac x = "lcf R S X f" and y = "lcf R S X g S" in Ring.ring_tOp_closed[of S], assumption+, frule mem_subring_mem_ring[of S " lcf R S X f ·rS lcf R S X g S "], assumption+, frule_tac x = "lcf R S X f" and y = "lcf R S X g S" in Idomain.idom_tOp_nonzeros[of S], assumption+, simp add:Subring_zero_ring_zero) apply(frule_tac x = "lcf R S X f ·rS lcf R S X g S" and y = "X^R (fst (s_cf R S X f) - fst (s_cf R S X g))" in Idomain.idom_tOp_nonzeros[of R], assumption+, frule_tac x = "lcf R S X f ·rS lcf R S X g S" and y = "X^R (fst (s_cf R S X f) - fst (s_cf R S X g))" in ring_tOp_closed, assumption+, frule_tac x = "lcf R S X f ·rS lcf R S X g S ·r X^R (fst (s_cf R S X f) - fst (s_cf R S X g))" and y = g in Idomain.idom_tOp_nonzeros[of R], assumption+, frule_tac x = "lcf R S X f ·rS lcf R S X g S ·r X^R (fst (s_cf R S X f) - fst (s_cf R S X g))" and y = g in ring_tOp_closed, assumption+) apply (frule pol_diff_deg_less[of f "s_cf R S X f" "s_cf R S X (lcf R S X f ·rS lcf R S X g S ·r X^R (fst (s_cf R S X f) - fst (s_cf R S X g)) ·r g)"], assumption+, simp add:s_cf_pol_coeff) apply (simp add:s_cf_deg[THEN sym]) apply (frule deg_mult_pols[of "lcf R S X f ·rS (lcf R S X g) S" "(X^R (deg_n R S X f - deg_n R S X g) )·r g"], assumption+, rule ring_tOp_closed, assumption+, rule Idomain.idom_tOp_nonzeros[of R], assumption+, (erule conjE)+, subst ring_tOp_assoc[of "lcf R S X f ·rS lcf R S X g S" _ g], assumption+, simp, cut_tac pol_of_deg0[THEN sym, of "lcf R S X f ·rS lcf R S X g S"], simp, thin_tac "deg_n R S X (lcf R S X f ·rS lcf R S X g S ·r (X^R (deg_n R S X f - deg_n R S X g) ·r g)) = deg_n R S X (X^R (deg_n R S X f - deg_n R S X g) ·r g)") apply (frule deg_mult_pols[of "(X^R (deg_n R S X f - deg_n R S X g) )" g], assumption+, simp, simp add:deg_to_X_d, assumption+, fold lcf_def, subst divisionTr0[of g "lcf R S X f ·rS lcf R S X g S" "fst (s_cf R S X f) - fst (s_cf R S X g)"], assumption+, simp add:Subring_zero_ring_zero) apply (subst Ring.ring_tOp_assoc, assumption+, simp add:lcf_mem, frule Corps.invf_inv[of S "lcf R S X g"], simp add:lcf_mem, simp add:Subring_zero_ring_zero, simp add:Ring.ring_r_one, frule s_cf_expr[of "lcf R S X f ·rS lcf R S X g S ·r X^R (fst (s_cf R S X f) - fst (s_cf R S X g)) ·r g"], rule Idomain.idom_tOp_nonzeros[of R], assumption+) apply ((erule conjE)+, thin_tac "snd (s_cf R S X (lcf R S X f ·rS lcf R S X g S ·r X^R (fst (s_cf R S X f) - fst (s_cf R S X g)) ·r g)) (fst (s_cf R S X (lcf R S X f ·rS lcf R S X g S ·r X^R (fst (s_cf R S X f) - fst (s_cf R S X g)) ·r g))) ≠ \<zero>S") apply (rotate_tac -1, drule sym, simp) done lemma (in PolynRg) divisionTr2:"[|Corps S; g ∈ carrier R; g ≠ \<zero>; 0 < deg_n R S X g|] ==> ∀f. div_condn R S X n g f" apply (cut_tac ring_is_ag, frule Corps.field_is_idom[of "S"], cut_tac subring, frule subring_Ring, cut_tac polyn_ring_integral, simp, cut_tac X_mem_R) apply (rule nat_less_induct) apply (rule allI) apply (subst div_condn_def, rule impI, (erule conjE)+) apply (case_tac "f = \<zero>R", cut_tac ring_zero, subgoal_tac " f ± -a (\<zero> ·r g) = \<zero>", blast, simp add:ring_times_0_x, simp add:aGroup.ag_inv_zero[of "R"], simp add:aGroup.ag_r_zero) apply (case_tac "n < deg_n R S X g") apply (cut_tac ring_zero, subgoal_tac "deg_n R S X (f ± -a (\<zero> ·r g)) < deg_n R S X g", blast) apply ( simp add:ring_times_0_x, simp add:aGroup.ag_inv_zero, simp add:aGroup.ag_r_zero) apply (frule_tac x = n and y = "deg_n R S X g" in leI, thin_tac "¬ n < deg_n R S X g") (** deg_n R S X g ≤ deg_n R S X f **) apply (frule_tac f = f in divisionTr1[of g], assumption+, simp) apply (frule_tac p = f in lcf_mem, frule lcf_mem[of g], frule lcf_nonzero[of g], assumption+, frule Corps.invf_closed1[of S "lcf R S X g"], simp) apply (frule_tac x = "lcf R S X f" and y = "lcf R S X g S" in Ring.ring_tOp_closed[of S], assumption+, simp) apply (frule_tac x = "lcf R S X f ·rS lcf R S X g S" in mem_subring_mem_ring, assumption) apply (frule_tac n = "deg_n R S X f - deg_n R S X g" in npClose[of X], frule_tac x = "lcf R S X f ·rS lcf R S X g S" and y = "X^R (deg_n R S X f - deg_n R S X g)" in ring_tOp_closed, assumption+, frule_tac x = "lcf R S X f ·rS lcf R S X g S ·r X^R (deg_n R S X f - deg_n R S X g)" and y = g in ring_tOp_closed, assumption+) apply (erule disjE, blast) apply (drule_tac a = "deg_n R S X (f ± -a (lcf R S X f ·rS lcf R S X g S ·r X^R (deg_n R S X f - deg_n R S X g) ·r g))" in forall_spec, simp) apply (simp add:div_condn_def) apply (drule_tac a = "f ± -a (lcf R S X f ·rS lcf R S X g S ·r X^R (deg_n R S X f - deg_n R S X g) ·r g)" in forall_spec1) apply (frule_tac x = "lcf R S X f ·rS lcf R S X g S ·r X^R (deg_n R S X f - deg_n R S X g) ·r g" in aGroup.ag_mOp_closed, assumption) apply (frule_tac x = f and y = "-a (lcf R S X f ·rS lcf R S X g S ·r X^R (deg_n R S X f - deg_n R S X g) ·r g)" in aGroup.ag_pOp_closed, assumption+, simp, thin_tac "deg_n R S X (f ± -a (lcf R S X f ·rS lcf R S X g S ·r X^R (deg_n R S X f - deg_n R S X g) ·r g)) < deg_n R S X f") apply (erule exE, thin_tac "f ± -a (lcf R S X f ·rS lcf R S X g S ·r X^R (deg_n R S X f - deg_n R S X g) ·r g) ∈ carrier R") apply ((erule conjE)+, frule_tac x = q and y = g in ring_tOp_closed, assumption+, frule_tac x = "q ·r g" in aGroup.ag_mOp_closed, assumption+, simp add:aGroup.ag_pOp_assoc, simp add:aGroup.ag_p_inv[THEN sym], simp add:ring_distrib2[THEN sym]) apply (frule_tac x = "lcf R S X f ·rS lcf R S X g S ·r X^R (deg_n R S X f - deg_n R S X g)" and y = q in aGroup.ag_pOp_closed, assumption+) apply (erule disjE) apply blast apply blast done lemma (in PolynRg) divisionTr3:"[|Corps S; g ∈ carrier R; g ≠ \<zero>; 0 < deg_n R S X g; f ∈ carrier R|] ==> ∃q∈carrier R. (f ± -a (q ·r g) = \<zero>) ∨ ( f ± -a (q ·r g) ≠ \<zero> ∧ deg_n R S X (f ± -a (q ·r g)) < (deg_n R S X g))" apply (frule divisionTr2[of g "deg_n R S X f"], assumption+) apply (drule_tac a = f in forall_spec1) apply (simp add:div_condn_def, blast) done lemma (in PolynRg) divisionTr4:"[|Corps S; g ∈ carrier R; g ≠ \<zero>; 0 < deg_n R S X g; f ∈ carrier R|] ==> ∃q∈carrier R. (f = q ·r g) ∨ (∃r∈carrier R. r ≠ \<zero> ∧ (f = (q ·r g) ± r) ∧ (deg_n R S X r) < (deg_n R S X g))" apply (cut_tac is_Ring, cut_tac ring_is_ag) apply (frule divisionTr3[of g f], assumption+, erule bexE, frule_tac x = q in ring_tOp_closed[of _ g], assumption+, erule disjE) apply (simp add:aGroup.ag_eq_diffzero[THEN sym, of "R" "f"], blast) apply (subgoal_tac "f = q ·r g ± (f ± -a (q ·r g))", subgoal_tac "(f ± -a (q ·r g)) ∈ carrier R", blast, rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_mOp_closed, assumption+) apply (frule_tac x = "q ·r g" in aGroup.ag_mOp_closed, assumption+, subst aGroup.ag_pOp_assoc[THEN sym], assumption+, subst aGroup.ag_pOp_commute[of R _ f], assumption+, subst aGroup.ag_pOp_assoc, assumption+, simp add:aGroup.ag_r_inv1, simp add:aGroup.ag_r_zero) done lemma (in PolynRg) divisionTr:"[|Corps S; g ∈ carrier R; 0 < deg R S X g; f ∈ carrier R|] ==> ∃q∈carrier R. (∃r∈carrier R. (f = (q ·r g) ± r) ∧ (deg R S X r) < (deg R S X g))" apply (subgoal_tac "g ≠ \<zero>", frule divisionTr4[of g f], assumption+, simp add:deg_def, simp only:an_0[THEN sym], cut_tac aless_nat_less[of "0" "deg_n R S X g"], simp, assumption) apply (erule bexE, erule disjE, cut_tac ring_is_ag, frule aGroup.ag_r_zero[of "R" "f"], simp, simp, rotate_tac -1, frule sym, cut_tac ring_zero, subgoal_tac "deg R S X \<zero> < deg R S X g", blast, simp add:deg_def an_def) apply (erule bexE, (erule conjE)+, cut_tac n1 = "deg_n R S X r" and m1 = "deg_n R S X g" in aless_natless[THEN sym], simp add:deg_def, drule sym, simp, rotate_tac -1, drule sym, blast) apply (rule contrapos_pp, simp+, simp add:deg_def, frule aless_imp_le[of "0" "-∞"], cut_tac minf_le_any[of "0"]) apply (frule ale_antisym[of "0" "-∞"], assumption) apply simp done lemma (in PolynRg) rel_prime_equation:"[|Corps S; f ∈ carrier R; g ∈ carrier R; 0 < deg R S X f; 0 < deg R S X g; rel_prime_pols R S X f g; h ∈ carrier R|] ==> ∃u ∈ carrier R. ∃v ∈ carrier R. (deg R S X u ≤ amax ((deg R S X h) - (deg R S X f)) (deg R S X g)) ∧ (deg R S X v ≤ (deg R S X f)) ∧ (u ·r f ± (v ·r g) = h)" apply (cut_tac ring_is_ag, cut_tac ring_zero, cut_tac subring, frule subring_Ring, frule aless_imp_le [of "0" "deg R S X f"], frule pol_nonzero[of f], simp, frule aless_imp_le [of "0" "deg R S X g"], frule pol_nonzero[of g], simp, frule Corps.field_is_idom[of "S"], cut_tac polyn_ring_integral, simp, frule Idomain.idom_tOp_nonzeros[of R f g], assumption+) apply (case_tac "h = \<zero>R") apply (cut_tac ring_is_ag, cut_tac ring_zero, subgoal_tac "deg R S X \<zero> ≤ amax (deg R S X h - deg R S X f) (deg R S X g)", subgoal_tac "deg R S X \<zero> ≤ deg R S X f ∧ \<zero> ·r f ± \<zero> ·r g = h", blast) apply (simp add:ring_times_0_x, simp add:aGroup.ag_r_zero, simp add:deg_def) apply (simp add:deg_def amax_def) apply (simp add:rel_prime_pols_def, frule principal_ideal[of f], frule principal_ideal[of g], frule ideals_set_sum[of "R ♦p f" "R ♦p g" "1r"], assumption+, thin_tac "1r ∈ R ♦p f \<minusplus> R ♦p g", (erule bexE)+, thin_tac "ideal R (R ♦p f)", thin_tac "ideal R (R ♦p g)", simp add:Rxa_def, (erule bexE)+, simp, thin_tac "ha = r ·r f", thin_tac "k = ra ·r g") apply (frule_tac x = r in ring_tOp_closed[of _ f], assumption+, frule_tac x = ra in ring_tOp_closed[of _ g], assumption+, frule_tac y1 = "r ·r f" and z1 = "ra ·r g" in ring_distrib1[THEN sym, of "h"], assumption+, simp add:ring_r_one, drule sym, simp, thin_tac "r ·r f ± ra ·r g = 1r", simp add:ring_tOp_assoc[THEN sym], simp add:ring_r_one) apply (frule_tac f = "h ·r r" in divisionTr[of g], assumption+, simp add:ring_tOp_closed, frule_tac f = "h ·r ra" in divisionTr[of f], assumption+, simp add:ring_tOp_closed, (erule bexE)+, (erule conjE)+) (** final **) apply (thin_tac " r ∈ carrier R", thin_tac "ra ∈ carrier R", thin_tac "r ·r f ∈ carrier R", thin_tac "ra ·r g ∈ carrier R") apply (frule_tac x = q in ring_tOp_closed[of _ g], assumption+, frule_tac x = qa in ring_tOp_closed[of _ f], assumption+, frule_tac x = "q ·r g" and y = rb in aGroup.ag_pOp_commute, assumption+, simp, thin_tac "q ·r g ± rb = rb ± q ·r g", thin_tac "h ·r r = rb ± q ·r g", thin_tac "h ·r ra = qa ·r f ± rc") apply (simp add:ring_distrib2[of g], frule_tac x = rb and y = "q ·r g" in aGroup.ag_pOp_closed[of R], assumption+, frule_tac x = "rb ± q ·r g" and y = f in ring_tOp_closed, assumption+, frule_tac x = "qa ·r f" and y = g in ring_tOp_closed, assumption+, frule_tac x = rc and y = g in ring_tOp_closed, assumption+, simp add:aGroup.ag_pOp_assoc[THEN sym, of "R"], simp add:ring_tOp_assoc[of _ f g], simp add:ring_tOp_commute[of f g], simp add:ring_tOp_assoc[THEN sym, of _ g f], frule_tac x = qa and y = g in ring_tOp_closed, assumption+, simp add:ring_distrib2[THEN sym], simp add:aGroup.ag_pOp_assoc, simp add:ring_distrib2[THEN sym], case_tac "q ±R qa = \<zero>R", simp add:ring_times_0_x, simp add:aGroup.ag_r_zero, subgoal_tac "deg R S X rb ≤ amax (deg R S X h - deg R S X f) (deg R S X g)", subgoal_tac "deg R S X rc ≤ deg R S X f", blast, simp add:aless_imp_le, frule_tac x = "deg R S X rb" and y = "deg R S X g" in aless_imp_le, rule_tac i = "deg R S X rb" in ale_trans[of _ "deg R S X g" "amax (deg R S X h - deg R S X f) (deg R S X g)"], assumption, simp add:amax_def, simp add:aneg_le aless_imp_le) apply (subgoal_tac "rb ± (q ± qa) ·r g ∈ carrier R", subgoal_tac "deg R S X (rb ± (q ± qa) ·r g) ≤ amax (deg R S X h - deg R S X f) (deg R S X g)", subgoal_tac "deg R S X rc ≤ deg R S X f", blast, simp add:aless_imp_le, frule_tac x = q and y = qa in aGroup.ag_pOp_closed[of "R"], assumption+, frule_tac p = rb and q = "(q ± qa) ·r g" in deg_pols_add1, rule ring_tOp_closed, assumption+, simp add:deg_mult_pols1, frule_tac p1 = "q ± qa" in pol_nonzero[THEN sym], simp) apply (frule_tac y = "deg R S X (q ± qa)" and z = "deg R S X rb" in aadd_le_mono[of "0"], simp add:aadd_0_l) apply (frule_tac p = "q ± qa" in deg_ant_int, assumption+, frule_tac x = "deg R S X rb" and y = "deg R S X g" and z = "int (deg_n R S X ( q ± qa))" in aadd_less_mono_z, simp add:aadd_commute) apply (simp add:deg_mult_pols1, frule_tac p = "rb ± (q ± qa) ·r g" and q = f in deg_mult_pols1, assumption+, simp, thin_tac "deg R S X (rb ± (q ± qa) ·r g) = deg R S X (q ± qa) + deg R S X g", frule_tac x = "rb ± (q ± qa) ·r g" and y = f in ring_tOp_closed, assumption+, simp only:aGroup.ag_pOp_commute, frule_tac p = "rc ·r g" and q = "(rb ± (q ± qa) ·r g) ·r f" in deg_pols_add1, assumption+, simp, thin_tac "deg R S X ((rb ± (q ± qa) ·r g) ·r f) = deg R S X (q ± qa) + deg R S X g + deg R S X f") apply (simp add:deg_mult_pols1, frule_tac p1 = "q ± qa" in pol_nonzero[THEN sym], simp, simp add:deg_ant_int[of g]) apply (frule_tac x = "deg R S X rc" and y = "deg R S X f" and z = "int (deg_n R S X g)" in aadd_less_mono_z, frule_tac a = "deg R S X ( q ± qa)" in aadd_pos_le[of _ "deg R S X f + ant (int (deg_n R S X g))"], frule_tac x = "deg R S X rc + ant (int (deg_n R S X g))" and y = "deg R S X f + ant (int (deg_n R S X g))" and z = "deg R S X ( q ± qa) + (deg R S X f + ant (int (deg_n R S X g)))" in aless_le_trans, assumption+, thin_tac "deg R S X rc + ant (int (deg_n R S X g)) < deg R S X f + ant (int (deg_n R S X g))", thin_tac "deg R S X f + ant (int (deg_n R S X g)) ≤ deg R S X ( q ± qa) + (deg R S X f + ant (int (deg_n R S X g)))") apply (simp add:deg_ant_int[THEN sym]) apply (frule_tac p = "q ± qa" in deg_in_aug_minf, frule_tac p = "g" in deg_in_aug_minf, frule_tac p = "f" in deg_in_aug_minf, simp add:aadd_commute[of "deg R S X f" "deg R S X g"], simp only:aadd_assoc_m[THEN sym], simp) apply (frule_tac p = "g" in deg_in_aug_minf, frule_tac p = "f" in deg_in_aug_minf, frule_tac p = "q ± qa" in deg_in_aug_minf, simp add:diff_ant_def, subgoal_tac "-(deg R S X f) ∈ Z-∞") apply (subst aadd_assoc_m[of _ "deg R S X f" "- deg R S X f"], simp add:Zminf_pOp_closed, assumption+, (simp add:aadd_minus_r, simp add:aadd_0_r), simp add:amax_ge_l, simp add:deg_ant_int, simp add:aminus, simp add:z_in_aug_minf) apply (rule aGroup.ag_pOp_closed, assumption+, rule ring_tOp_closed, rule aGroup.ag_pOp_closed, assumption+) done subsection "polynomial, coeff mod P" constdefs P_mod::"[('a, 'm) Ring_scheme, ('a, 'm1) Ring_scheme, 'a, 'a set, 'a] => bool" "P_mod R S X P p == p = \<zero>R ∨ (∀j ≤ (fst (s_cf R S X p)). (snd (s_cf R S X p) j) ∈ P)" lemma (in PolynRg) P_mod_whole:"p ∈ carrier R ==> P_mod R S X (carrier S) p" apply (case_tac "p = \<zero>R", simp add:P_mod_def) apply (simp add:P_mod_def, rule allI, rule impI, rule pol_coeff_mem, simp add:s_cf_pol_coeff, assumption) done lemma (in PolynRg) zero_P_mod:"ideal S I ==> P_mod R S X I \<zero>" by (simp add:P_mod_def) lemma (in PolynRg) P_mod_mod:"[|ideal S I; p ∈ carrier R; pol_coeff S c; p = polyn_expr R X (fst c) c|] ==> (∀j ≤ (fst c). (snd c) j ∈ I) = (P_mod R S X I p)" apply (cut_tac subring, frule subring_Ring) apply (case_tac "p = \<zero>R") apply (simp add:P_mod_def, drule sym, frule coeff_0_pol_0[THEN sym, of c "fst c"], simp, simp) apply (rule impI, simp add:Ring.ideal_zero) apply (frule s_cf_expr[of p], simp add:P_mod_def, (erule conjE)+) apply (frule polyn_c_max[of c]) apply (frule coeff_nonzero_polyn_nonzero[of c "fst c"], simp) apply (frule coeff_max_nonzeroTr[of c], simp) apply (thin_tac "(polyn_expr R X (fst c) c ≠ \<zero>) = (∃j≤fst c. snd c j ≠ \<zero>S)") apply (frule coeff_max_bddTr[of c]) apply (frule polyn_expr_short[of c "c_max S c"], assumption+) apply (frule pol_expr_unique[of p "(c_max S c, snd c)" "s_cf R S X p"], assumption+, rule split_pol_coeff[of c], assumption+, simp, simp, assumption+) apply (thin_tac "p = polyn_expr R X (fst c) c", thin_tac "p = polyn_expr R X (fst (s_cf R S X p)) (s_cf R S X p)", thin_tac "polyn_expr R X (fst c) c = polyn_expr R X (c_max S c) c", thin_tac "polyn_expr R X (c_max S c) c = polyn_expr R X (c_max S c) (c_max S c, snd c)") apply (frule coeff_max_zeroTr[of c], (erule conjE)+) apply (subst P_mod_def, simp) apply (rule iffI, rule allI, rule impI) apply (rotate_tac 10, drule_tac a = j in forall_spec, drule_tac a = j in forall_spec1, assumption, frule_tac i = j and j = "fst (s_cf R S X p)" and k = "fst c" in le_trans, assumption+, drule_tac a = j in forall_spec, assumption, simp) apply (rule allI, rule impI) apply (case_tac "fst (s_cf R S X p) < j", drule_tac a = j in forall_spec, simp, simp add:Ring.ideal_zero, frule_tac x = "fst (s_cf R S X p)" and y = j in leI, thin_tac "∀j. j ≤ fst c ∧ fst (s_cf R S X p) < j --> snd c j = \<zero>S", drule_tac a = j in forall_spec, assumption, drule_tac a = j in forall_spec, assumption, simp) done lemma (in PolynRg) monomial_P_mod_mod:"[|ideal S I; c ∈ carrier S; p = c ·r (X^R d)|] ==> (c ∈ I) = (P_mod R S X I p)" apply (cut_tac subring, frule subring_Ring) apply (cut_tac monomial_d[THEN sym, of "(0, λj. c)" "d"], simp) apply (drule sym, simp) apply (subst P_mod_mod[THEN sym, of I p "ext_cf S d (0, λj. c)"], assumption+) apply (frule mem_subring_mem_ring[of S c], assumption, cut_tac X_mem_R, frule npClose[of X d], drule sym, simp add:ring_tOp_closed) apply (simp add:pol_coeff_def, rule allI, rule impI, simp add:ext_cf_def sliden_def, rule impI, simp add:Ring.ring_zero, subst ext_cf_len, simp add:pol_coeff_def, simp) apply (subst ext_cf_len, simp add:pol_coeff_def, simp add:ext_cf_def) apply (rule iffI) apply (simp add:Ring.ideal_zero, drule_tac a = d in forall_spec1, simp, simp add:pol_coeff_def) done lemma (in PolynRg) P_mod_add:"[|ideal S I; p ∈ carrier R; q ∈ carrier R; P_mod R S X I p; P_mod R S X I q|] ==> P_mod R S X I (p ± q)" apply (cut_tac subring, frule subring_Ring, cut_tac ring_is_ag) apply (case_tac "p = \<zero>R", simp add:aGroup.ag_l_zero, case_tac "q = \<zero>R", simp add:aGroup.ag_r_zero) apply (case_tac "p ±R q = \<zero>R", simp add:P_mod_def) apply (frule s_cf_expr[of p], assumption, frule s_cf_expr[of q], assumption, (erule conjE)+) apply (frule polyn_add1[of "s_cf R S X p" "s_cf R S X q"], assumption+, drule sym, drule sym, simp, drule sym, simp, rotate_tac -1, drule sym) apply (frule P_mod_mod[THEN sym, of I p "s_cf R S X p"], assumption+, simp, thin_tac "polyn_expr R X (fst (s_cf R S X p)) (s_cf R S X p) = p", frule P_mod_mod[THEN sym, of I q "s_cf R S X q"], assumption+, simp, thin_tac "polyn_expr R X (fst (s_cf R S X q)) (s_cf R S X q) = q") apply (frule aGroup.ag_pOp_closed[of R p q], assumption+) apply (subst P_mod_mod[THEN sym, of I "p ± q" "add_cf S (s_cf R S X p) (s_cf R S X q)"], assumption+, simp add:add_cf_pol_coeff, simp, simp add:add_cf_len, thin_tac "p ± q = polyn_expr R X (max (fst (s_cf R S X p)) (fst (s_cf R S X q))) (add_cf S (s_cf R S X p) (s_cf R S X q))") apply simp apply (subst add_cf_len, assumption+) apply (rule allI, rule impI) apply (cut_tac x = "fst (s_cf R S X p)" and y = "fst (s_cf R S X q)" in less_linear) apply (erule disjE) apply (simp add:max_def, subst add_cf_def, simp, (rule impI, drule_tac a = j in forall_spec, assumption, drule_tac a = j in forall_spec1, frule_tac x = j and y = "fst (s_cf R S X p)" and z = "fst (s_cf R S X q)" in le_less_trans, assumption+, frule_tac x = j and y = "fst (s_cf R S X q)" in less_imp_le, simp)) apply (rule Ring.ideal_pOp_closed[of S I], assumption+) apply (erule disjE) apply (simp add:max_def, subst add_cf_def, simp, drule_tac a = j in forall_spec, assumption, drule_tac a = j in forall_spec, assumption) apply (rule Ring.ideal_pOp_closed[of S I], assumption+) apply (simp add:max_def, subst add_cf_def, simp, rule impI, drule_tac a = j in forall_spec1, drule_tac a = j in forall_spec, assumption, frule_tac x = j and y = "fst (s_cf R S X q)" and z = "fst (s_cf R S X p)" in le_less_trans, assumption+, frule_tac x = j and y = "fst (s_cf R S X p)" in less_imp_le, simp) apply (rule Ring.ideal_pOp_closed[of S I], assumption+) done lemma (in PolynRg) P_mod_minus:"[|ideal S I; p ∈ carrier R; P_mod R S X I p|] ==> P_mod R S X I (-a p)" apply (cut_tac ring_is_ag, cut_tac subring, frule subring_Ring) apply (case_tac "p = \<zero>R", simp add:aGroup.ag_inv_zero) apply (frule s_cf_expr[of p], assumption+, (erule conjE)+, frule polyn_minus_m_cf[of "s_cf R S X p" "fst (s_cf R S X p)"], simp, frule aGroup.ag_inv_inj[of R p \<zero>], assumption, simp add:ring_zero, assumption, simp add:aGroup.ag_inv_zero, frule m_cf_pol_coeff[of "s_cf R S X p"], drule sym, drule sym, simp) apply (subst P_mod_mod[THEN sym, of I "-a p" "m_cf S (s_cf R S X p)"], assumption+, rule aGroup.ag_mOp_closed[of R p], assumption+, simp add:m_cf_len, thin_tac "polyn_expr R X (fst (s_cf R S X p)) (m_cf S (s_cf R S X p)) = -a p") apply (frule P_mod_mod[THEN sym, of I p "s_cf R S X p"], assumption+, simp, thin_tac "polyn_expr R X (fst (s_cf R S X p)) (s_cf R S X p) = p", simp) apply (rule allI, rule impI, drule_tac a = j in forall_spec, simp add:m_cf_len, subst m_cf_def, simp, rule Ring.ideal_inv1_closed[of S I], assumption+) done lemma (in PolynRg) P_mod_pre:"[|ideal S I; pol_coeff S ((Suc n), f); P_mod R S X I (polyn_expr R X (Suc n) (Suc n, f))|] ==> P_mod R S X I (polyn_expr R X n (n, f))" apply (frule pol_coeff_pre[of n f], frule polyn_mem[of "(n, f)" n],simp, frule polyn_mem[of "(Suc n, f)" "Suc n"], simp) apply (case_tac "polyn_expr R X n (n, f) = \<zero>R", simp add:P_mod_def) apply (subst P_mod_mod[THEN sym, of I "polyn_expr R X n (n, f)" "(n, f)"], assumption+, simp, frule P_mod_mod[THEN sym, of I "polyn_expr R X (Suc n) (Suc n, f)" "(Suc n, f)"], assumption+, simp, simp) done lemma (in PolynRg) P_mod_pre1:"[|ideal S I; pol_coeff S ((Suc n), f); P_mod R S X I (polyn_expr R X (Suc n) (Suc n, f))|] ==> P_mod R S X I (polyn_expr R X n (Suc n, f))" by (simp add:polyn_expr_restrict[of n f], simp add:P_mod_pre) lemma (in PolynRg) P_mod_coeffTr:"[|ideal S I; d ∈ carrier S|] ==> (P_mod R S X I d) = (d ∈ I)" apply (cut_tac subring, frule subring_Ring, subst monomial_P_mod_mod[of I d "d ·r X^R 0" 0], assumption+, simp, simp, frule mem_subring_mem_ring[of _ d], assumption+, simp add:ring_r_one) done lemma (in PolynRg) P_mod_mult_const:"[|ideal S I; ideal S J; pol_coeff S (n, f); P_mod R S X I (polyn_expr R X n (n, f)); pol_coeff S (0, g); P_mod R S X J (polyn_expr R X 0 (0, g))|] ==> P_mod R S X (I ♦rS J) ((polyn_expr R X n (n, f)) ·r (polyn_expr R X 0 (0, g)))" apply (cut_tac subring, frule subring_Ring) apply (frule_tac c = "(n, f)" in polyn_mem[of _ n], simp) apply (frule Ring.ideal_prod_ideal[of S I J], assumption+) apply (case_tac "polyn_expr R X n (n, f) = \<zero>R", simp) apply (frule_tac c = "(0, g)" in polyn_mem[of _ 0], simp, simp add:ring_times_0_x, simp add:P_mod_def) apply (simp add:polyn_expr_def [of _ _ "0"]) apply (frule pol_coeff_mem[of "(0, g)" 0], simp, simp, frule mem_subring_mem_ring[of S "g 0"], assumption, simp add:ring_r_one, simp add:ring_tOp_commute[of _ "g 0"]) apply (frule sp_cf_pol_coeff[of "(n, f)" "g 0"], assumption+) apply (subst scalar_times_pol_expr[of "g 0" "(n, f)" n], assumption+, simp) apply (subst P_mod_mod[THEN sym, of "I ♦rS J" "polyn_expr R X n (sp_cf S (g 0) (n, f))" "sp_cf S (g 0) (n, f)"], assumption+, simp add:polyn_mem, simp add:sp_cf_pol_coeff, rule polyn_mem, simp add:sp_cf_pol_coeff, simp add:sp_cf_len, simp, simp add:sp_cf_len) apply (frule P_mod_mod[THEN sym, of I "polyn_expr R X n (n, f)" "(n, f)"], assumption+, simp, simp, simp add:sp_cf_len, subst sp_cf_def, simp, simp add:P_mod_coeffTr[of J "g 0"]) apply (rule allI, rule impI, drule_tac a = j in forall_spec, assumption, frule_tac h = "f j" in Ring.ideal_subset[of S I], assumption+, simp add:Ring.ring_tOp_commute[of S "g 0"]) apply (simp add:Ring.prod_mem_prod_ideals[of S I J]) done lemma (in PolynRg) P_mod_mult_const1:"[|ideal S I; ideal S J; pol_coeff S (n, f); P_mod R S X I (polyn_expr R X n (n, f)); d ∈ J|] ==> P_mod R S X (I ♦rS J) ((polyn_expr R X n (n, f)) ·r d)" apply (cut_tac subring, frule subring_Ring) apply (frule P_mod_coeffTr[THEN sym, of J d], simp add:Ring.ideal_subset, simp) apply (frule P_mod_mult_const[of I J n f "λj. d"], assumption+, simp add:pol_coeff_def, simp add:Ring.ideal_subset) apply (subst polyn_expr_def, simp, frule Ring.ideal_subset[of S J d], assumption+, frule mem_subring_mem_ring[of S d], assumption, simp add:ring_r_one) apply (simp add:polyn_expr_def[of _ _ 0], frule Ring.ideal_subset[of S J d], assumption+, frule mem_subring_mem_ring[of S d], assumption, simp add:ring_r_one) done lemma (in PolynRg) P_mod_mult_monomial:"[|ideal S I; p ∈ carrier R|] ==> (P_mod R S X I p ) = (P_mod R S X I (p ·r X^R m))" apply (cut_tac X_mem_R, cut_tac subring, frule subring_Ring) apply (frule npClose[of X m], simp add:ring_tOp_commute[of p ]) apply (case_tac "p = \<zero>R", simp add:ring_times_x_0) apply (rule iffI) apply (frule s_cf_expr[of p], assumption+, (erule conjE)+, cut_tac low_deg_terms_zero[THEN sym, of "fst (s_cf R S X p)" "snd (s_cf R S X p)" m], simp add:polyn_expr_split[THEN sym], thin_tac "X^R m ·r p = polyn_expr R X (fst (s_cf R S X p) + m) (ext_cf S m (s_cf R S X p))", frule ext_cf_pol_coeff[of "s_cf R S X p" m]) apply (frule P_mod_mod[THEN sym, of I p "s_cf R S X p"], assumption+, thin_tac "p = polyn_expr R X (fst (s_cf R S X p)) (s_cf R S X p)", simp) apply (frule P_mod_mod[THEN sym, of I "polyn_expr R X (fst (s_cf R S X p) + m) (ext_cf S m (s_cf R S X p))" "ext_cf S m (s_cf R S X p)"], rule polyn_mem, assumption, simp add:ext_cf_def, assumption, simp add:ext_cf_len add_commute, simp, thin_tac "P_mod R S X I (polyn_expr R X (fst (s_cf R S X p) + m) (ext_cf S m (s_cf R S X p))) = (∀j≤fst (ext_cf S m (s_cf R S X p)). snd (ext_cf S m (s_cf R S X p)) j ∈ I)", thin_tac "snd (s_cf R S X p) (fst (s_cf R S X p)) ≠ \<zero>S") apply (rule allI, rule impI, simp add:ext_cf_len) apply ( subst ext_cf_def, simp add:sliden_def) apply (rule impI, simp add:Ring.ideal_zero[of S]) apply (simp add:pol_coeff_split[THEN sym]) apply (frule s_cf_expr[of p], assumption+, (erule conjE)+, cut_tac low_deg_terms_zero[THEN sym, of "fst (s_cf R S X p)" "snd (s_cf R S X p)" m], simp add:polyn_expr_split[THEN sym], thin_tac "X^R m ·r p = polyn_expr R X (fst (s_cf R S X p) + m) (ext_cf S m (s_cf R S X p))", frule ext_cf_pol_coeff[of "s_cf R S X p" m]) apply (frule P_mod_mod[THEN sym, of I "polyn_expr R X (fst (s_cf R S X p) + m) (ext_cf S m (s_cf R S X p))" "ext_cf S m (s_cf R S X p)"], rule polyn_mem, assumption, simp add:ext_cf_def, assumption, simp add:ext_cf_len add_commute, simp, thin_tac "p = polyn_expr R X (fst (s_cf R S X p)) (s_cf R S X p)", thin_tac "P_mod R S X I (polyn_expr R X (fst (s_cf R S X p) + m) (ext_cf S m (s_cf R S X p)))", thin_tac "snd (s_cf R S X p) (fst (s_cf R S X p)) ≠ \<zero>S") apply (subst P_mod_mod[THEN sym, of I p "s_cf R S X p"], assumption+, cut_tac s_cf_expr[of p], simp, assumption+, rule allI, rule impI, thin_tac "pol_coeff S (ext_cf S m (s_cf R S X p))", simp add:ext_cf_len, simp add:ext_cf_def) apply (drule_tac a = "m + j" in forall_spec1, frule_tac i = j and j = "fst (s_cf R S X p)" and k = m and l = m in add_le_mono, simp, simp only:add_commute[of _ m], thin_tac "j ≤ fst (s_cf R S X p)", simp, simp add:sliden_def) apply simp done lemma (in PolynRg) P_mod_multTr:"[|ideal S I; ideal S J; pol_coeff S (n, f); P_mod R S X I (polyn_expr R X n (n, f))|] ==> ∀g. ((pol_coeff S (m, g) ∧ (P_mod R S X J (polyn_expr R X m (m, g)))) --> P_mod R S X (I ♦rS J) ((polyn_expr R X n (n, f)) ·r (polyn_expr R X m (m, g))))" apply (cut_tac subring, frule subring_Ring, cut_tac ring_is_ag, cut_tac X_mem_R) apply (frule polyn_mem[of "(n, f)" n], simp) apply (frule Ring.ideal_prod_ideal[of "S" "I" "J"], assumption+) apply (case_tac "polyn_expr R X n (n, f) = \<zero>R", simp) apply (rule allI, rule impI, erule conjE) apply (frule_tac c = "(m, g)" in polyn_mem[of _ m], simp, simp add:ring_times_0_x, simp add:P_mod_def) apply (induct_tac m) apply (rule allI, rule impI, erule conjE, rule_tac g = g in P_mod_mult_const[of I J n f], assumption+) (* case m = 0 done *) apply (rule allI, rule impI, erule conjE) apply (frule_tac n = na and f = g in pol_coeff_pre, frule_tac n = na and f = g in P_mod_pre[of J], assumption+) apply (drule_tac a = g in forall_spec, simp) apply (frule_tac n = na and f = g in polyn_Suc_split, simp del:npow_suc) apply (thin_tac "polyn_expr R X (Suc na) (Suc na, g) = polyn_expr R X na (na, g) ± g (Suc na) ·r X^R (Suc na)") apply (frule_tac c = "(na, g)" and k = na in polyn_mem, simp, subgoal_tac "(g (Suc na)) ·r (X^R (Suc na)) ∈ carrier R", subst ring_distrib1, assumption+) apply (frule_tac p = "(polyn_expr R X n (n, f)) ·r (polyn_expr R X na (na, g))" and q = "(polyn_expr R X n (n, f)) ·r ((g (Suc na)) ·r (X^R (Suc na)))" in P_mod_add[of "I ♦rS J"]) apply (simp add:ring_tOp_closed, rule ring_tOp_closed, assumption+) apply (frule_tac c = "(Suc na, g)" and j = "Suc na" in pol_coeff_mem_R, simp) apply (subst ring_tOp_assoc[THEN sym], assumption+, simp, rule npClose, assumption+) apply (subst P_mod_mult_monomial[THEN sym, of "I ♦rS J"], assumption, rule ring_tOp_closed, assumption+, simp add:pol_coeff_mem_R) apply (rule P_mod_mult_const1, assumption+, thin_tac "P_mod R S X (I ♦rS J) (polyn_expr R X n (n, f) ·r polyn_expr R X na (na, g))") apply (cut_tac n1 = na and c1 = "(Suc na, g)" in polyn_Suc[THEN sym], simp, simp, frule_tac c = "(Suc na, g)" and k = na in polyn_expr_short, simp, simp, thin_tac "P_mod R S X J (polyn_expr R X na (na, g))", thin_tac "polyn_expr R X na (na, g) ∈ carrier R", thin_tac "polyn_expr R X na (na, g) ± g (Suc na) ·r (X^R na ·r X) = polyn_expr R X (Suc na) (Suc na, g)", thin_tac "polyn_expr R X na (Suc na, g) = polyn_expr R X na (na, g)") apply (frule_tac p1 = "polyn_expr R X (Suc na) (Suc na, g)" and c1 = "(Suc na, g)" in P_mod_mod[THEN sym, of J], simp add:polyn_mem, assumption, simp, simp) apply (simp, rule ring_tOp_closed, cut_tac c = "(Suc na, g)" and j = "Suc na" in pol_coeff_mem_R, assumption, simp, simp, rule npClose, assumption+) done lemma (in PolynRg) P_mod_mult:"[|ideal S I; ideal S J; pol_coeff S (n, c); pol_coeff S (m, d); P_mod R S X I (polyn_expr R X n (n, c)); P_mod R S X J (polyn_expr R X m (m, d))|] ==> P_mod R S X (I ♦rS J) ((polyn_expr R X n (n, c)) ·r (polyn_expr R X m (m, d)))" apply (simp add:P_mod_multTr) done lemma (in PolynRg) P_mod_mult1:"[|ideal S I; ideal S J; p ∈ carrier R; q ∈ carrier R; P_mod R S X I p; P_mod R S X J q|] ==> P_mod R S X (I ♦rS J) (p ·r q)" apply (case_tac "p = \<zero>R") apply (simp add:ring_times_0_x, simp add:P_mod_def) apply (case_tac "q = \<zero>R") apply (simp add:ring_times_x_0, simp add:P_mod_def) apply (frule s_cf_expr[of p], assumption+, frule s_cf_expr[of q], assumption+, (erule conjE)+) apply (cut_tac P_mod_mult[of I J "fst (s_cf R S X p)" "snd (s_cf R S X p)" "fst (s_cf R S X q)" "snd (s_cf R S X q)"]) apply (simp add:polyn_expr_split[THEN sym], assumption+) apply (simp add:pol_coeff_split[THEN sym]) apply (simp add:polyn_expr_split[THEN sym])+ done lemma (in PolynRg) P_mod_mult2l:"[|ideal S I; p ∈ carrier R; q ∈ carrier R; P_mod R S X I p|] ==> P_mod R S X I (p ·r q)" apply (cut_tac subring, frule subring_Ring[of S], frule Ring.whole_ideal[of S]) apply (frule P_mod_whole[of q]) apply (frule P_mod_mult1[of I "carrier S" p q], assumption+) apply (simp add:Ring.idealprod_whole_r) done lemma (in PolynRg) P_mod_mult2r:"[|ideal S I; p ∈ carrier R; q ∈ carrier R; P_mod R S X I q|] ==> P_mod R S X I (p ·r q)" apply (cut_tac subring, frule subring_Ring[of S], frule Ring.whole_ideal[of S]) apply (frule P_mod_whole[of p]) apply (frule P_mod_mult1[of "carrier S" I p q], assumption+) apply (simp add:Ring.idealprod_whole_l) done lemma (in PolynRg) csrp_fn_pol_coeff:"[|ideal S P; PolynRg R' (S /r P) Y; pol_coeff (S /r P) (n, c')|] ==> pol_coeff S (n, (cmp (csrp_fn S P) c'))" apply (cut_tac subring, frule subring_Ring) apply (simp add:pol_coeff_def) apply (rule allI, rule impI, simp add:cmp_def) apply (rule Ring.csrp_fn_mem[of S P], assumption+) apply simp done lemma (in PolynRg) pj_csrp_mem_coeff:"[|ideal S P; pol_coeff (S /r P) (n, c')|] ==> ∀j ≤ n. (pj S P) ((csrp_fn S P) (c' j)) = c' j" apply (cut_tac subring, frule subring_Ring) apply (rule allI, rule impI, simp add:pol_coeff_def) apply (simp add:Ring.csrp_pj) done lemma (in PolynRg) pHom_pj_csrp:"[|Idomain S; ideal S P; PolynRg R' (S /r P) Y; pol_coeff (S /r P) (n, c')|] ==> erH R S X R' (S /r P) Y (pj S P) (polyn_expr R X n (n, (cmp (csrp_fn S P) c'))) = polyn_expr R' Y n (n, c')" apply (cut_tac subring, frule subring_Ring, frule Ring.qring_ring[of "S" "P"], assumption+) apply (subst pHom_mem[of R' "(S /r P)" Y "erH R S X R' (S /r P) Y (pj S P)" n "cmp (csrp_fn S P) c'"], assumption+, rule erH_rHom[of R' "S /r P" Y "pj S P"], assumption+, simp add:pj_Hom, simp add:csrp_fn_pol_coeff) apply (rule PolynRg.polyn_exprs_eq[of R' "S /r P" Y "(n, cmp (erH R S X R' (S /r P) Y (pj S P)) (cmp (csrp_fn S P) c'))" "(n, c')" n], assumption+) apply (frule csrp_fn_pol_coeff[of P R' Y n c'], assumption+, frule erH_rHom [of R' "S /r P" Y "pj S P"], assumption+, simp add:pj_Hom, rule cmp_pol_coeff_e[of R' "S /r P" Y "erH R S X R' (S /r P) Y (pj S P)" n "cmp (csrp_fn S P) c'"], assumption+, simp) apply (rule allI, rule impI, simp add:cmp_def, frule_tac c = "(n, c')" and j = j in PolynRg.pol_coeff_mem[of R' "S /r P" Y], assumption+, simp+, frule_tac x = "c' j" in Ring.csrp_fn_mem[of S P], assumption+, frule_tac s = "csrp_fn S P (c' j)" in erH_rHom_cf[of R' "S /r P" Y "pj S P"], assumption+, simp add:pj_Hom, assumption+) apply (simp add:pj_csrp_mem_coeff) done lemma (in PolynRg) ext_csrp_fn_nonzero:"[|Idomain S; ideal S P; PolynRg R' (S /r P) Y; g' ∈ carrier R'; g' ≠ \<zero>R' |] ==> polyn_expr R X (deg_n R' (S /r P) Y g') ((deg_n R' (S /r P) Y g'), (cmp (csrp_fn S P) (snd (s_cf R' (S /r P) Y g')))) ≠ \<zero>" apply (cut_tac subring, frule subring_Ring, frule Ring.qring_ring[of "S" "P"], assumption+, frule pj_Hom[of "S" "P"], assumption+, frule PolynRg.s_cf_expr[of R' "S /r P" Y g'], assumption+, (erule conjE)+) apply (simp add:PolynRg.s_cf_deg[THEN sym, of R' "S /r P" Y g'], frule csrp_fn_pol_coeff[of P R' Y "deg_n R' (S /r P) Y g'" "snd (s_cf R' (S /r P) Y g')"], assumption+, simp add:PolynRg.s_cf_deg[of R' "S /r P" Y g']) apply (subst coeff_nonzero_polyn_nonzero[of "(deg_n R' (S /r P) Y g', cmp (csrp_fn S P) (snd (s_cf R' (S /r P) Y g')))" "deg_n R' (S /r P) Y g'"], assumption+, simp) apply (simp add:cmp_def, rule contrapos_pp, simp+) apply (drule_tac a = "deg_n R' (S /r P) Y g'" in forall_spec, simp, frule pj_csrp_mem_coeff[of P "deg_n R' (S /r P) Y g'" "snd (s_cf R' (S /r P) Y g')"], simp add:PolynRg.s_cf_deg[of R' "S /r P" Y g']) apply (drule_tac a = "deg_n R' (S /r P) Y g'" in forall_spec, simp, simp, frule pj_Hom[of S P], assumption, simp add:rHom_0_0) done lemma (in PolynRg) erH_inv:"[|Idomain S; ideal S P; Ring R'; PolynRg R' (S /r P) Y; g' ∈ carrier R'|] ==> ∃g∈carrier R. deg R S X g ≤ (deg R' (S /r P) Y g') ∧ (erH R S X R' (S /r P) Y (pj S P)) g = g'" apply (cut_tac subring, frule subring_Ring, frule Ring.qring_ring[of "S" "P"], assumption+, frule pj_Hom[of "S" "P"], assumption+) apply (frule erH_rHom[of R' "S /r P" Y "pj S P"], assumption+) apply (case_tac "g' = \<zero>R'", simp, frule erH_rHom_0[of R' "S /r P" Y "pj S P"], assumption+, cut_tac ring_zero, subgoal_tac "deg R S X (\<zero>) ≤ deg R' (S /r P) Y g'", blast, simp add:deg_def) apply (frule PolynRg.s_cf_expr [of R' "S /r P" Y g'], assumption+, (erule conjE)+) apply (frule pHom_pj_csrp[of P R' Y "fst (s_cf R' (S /r P) Y g')" "snd (s_cf R' (S /r P) Y g')"], assumption+, simp add:PolynRg.pol_coeff_split[THEN sym], drule sym, simp) apply (subgoal_tac "deg R S X (polyn_expr R X (fst (s_cf R' (S /r P) Y g')) (fst (s_cf R' (S /r P) Y g'), cmp (csrp_fn S P) (snd (s_cf R' (S /r P) Y g')))) ≤ deg R' (S /r P) Y g'", subgoal_tac "polyn_expr R X (fst (s_cf R' (S /r P) Y g')) (fst (s_cf R' (S /r P) Y g'), cmp (csrp_fn S P) (snd (s_cf R' (S /r P) Y g'))) ∈ carrier R", blast) apply(thin_tac " deg R S X (polyn_expr R X (fst (s_cf R' (S /r P) Y g')) (fst (s_cf R' (S /r P) Y g'), cmp (csrp_fn S P) (snd (s_cf R' (S /r P) Y g')))) ≤ deg R' (S /r P) Y g'", thin_tac "polyn_expr R' Y (fst (s_cf R' (S /r P) Y g')) (s_cf R' (S /r P) Y g') = g'", thin_tac "erH R S X R' (S /r P) Y (pj S P) (polyn_expr R X (fst (s_cf R' (S /r P) Y g')) (fst (s_cf R' (S /r P) Y g'), cmp (csrp_fn S P) (snd (s_cf R' (S /r P) Y g')))) = g'", thin_tac "snd (s_cf R' (S /r P) Y g') (fst (s_cf R' (S /r P) Y g')) ≠ \<zero>S /r P") apply (rule_tac c = "(fst (s_cf R' (S /r P) Y g'), cmp (csrp_fn S P) (snd (s_cf R' (S /r P) Y g')))" and k = "fst (s_cf R' (S /r P) Y g')" in polyn_mem) apply (rule csrp_fn_pol_coeff, assumption+, simp, simp, cut_tac pol_deg_le_n[of "polyn_expr R X (fst (s_cf R' (S /r P) Y g')) (fst (s_cf R' (S /r P) Y g'), cmp (csrp_fn S P) (snd (s_cf R' (S /r P) Y g')))" "(fst (s_cf R' (S /r P) Y g'), cmp (csrp_fn S P) (snd (s_cf R' (S /r P) Y g')))"]) apply (simp, simp add:PolynRg.s_cf_deg[THEN sym, of R' "S /r P" Y g'], frule ext_csrp_fn_nonzero[of P R' Y g'], assumption+, simp add:deg_def, simp add:ale_natle, rule polyn_mem, simp add:csrp_fn_pol_coeff, simp, simp add:csrp_fn_pol_coeff, simp) done lemma (in PolynRg) P_mod_0:"[|Idomain S; ideal S P; PolynRg R' (S /r P) Y; g ∈ carrier R|] ==> (erH R S X R' (S /r P) Y (pj S P) g = \<zero>R') = (P_mod R S X P g)" apply (cut_tac subring, frule subring_Ring, frule Ring.qring_ring[of "S" "P"], assumption+, frule pj_Hom[of "S" "P"], assumption+) apply (case_tac "g = \<zero>R", cut_tac ring_zero, simp add:P_mod_def, rule erH_rHom_0[of R' "S /r P" Y "pj S P"], assumption+) apply (frule s_cf_expr[of g], assumption+, (erule conjE)+, cut_tac polyn_expr_split[of "fst (s_cf R S X g)" "s_cf R S X g"]) apply (frule erH_map[of R' "S /r P" Y "pj S P" "fst (s_cf R S X g)" "snd (s_cf R S X g)"], assumption+) apply (subst pol_coeff_split[THEN sym], assumption) apply (drule sym, simp) apply (thin_tac "erH R S X R' (S /r P) Y (pj S P) g = polyn_expr R' Y (fst (s_cf R S X g)) (fst (s_cf R S X g), cmp (pj S P) (snd (s_cf R S X g)))") apply (rotate_tac -1, drule sym) apply (subst P_mod_mod[THEN sym, of P g "s_cf R S X g"], assumption+, thin_tac "g = polyn_expr R X (fst (s_cf R S X g)) (s_cf R S X g)", frule erH_rHom_coeff[of R' "S /r P" Y "pj S P" "fst (s_cf R S X g)" "snd (s_cf R S X g)"], assumption+, simp) apply (subst PolynRg.coeff_0_pol_0[THEN sym, of R' "S /r P" Y "(fst (s_cf R S X g), cmp (pj S P) (snd (s_cf R S X g)))" "fst (s_cf R S X g)"], assumption+, simp, thin_tac "pol_coeff (S /r P) (fst (s_cf R S X g), cmp (pj S P) (snd (s_cf R S X g)))") apply (simp add:cmp_def) apply (rule iffI) apply (rule allI, rule impI, drule_tac a = j in forall_spec, assumption, frule_tac j = j in pol_coeff_mem[of "s_cf R S X g"], assumption+, simp add:pj_zero[of S P]) apply (rule allI, rule impI, drule_tac a = j in forall_spec, assumption, frule_tac j = j in pol_coeff_mem[of "s_cf R S X g"], assumption+, simp add:pj_zero[THEN sym, of S P]) done lemma (in PolynRg) P_mod_I_J:"[|p ∈ carrier R; ideal S I; ideal S J; I ⊆ J; P_mod R S X I p|] ==> P_mod R S X J p" apply (case_tac "p = \<zero>R", simp) apply (simp add:P_mod_def) apply (frule s_cf_expr[of p], assumption, (erule conjE)+) apply (frule P_mod_mod[THEN sym, of I p "s_cf R S X p"], assumption+) apply (subst P_mod_mod[THEN sym, of J p "s_cf R S X p"], assumption+, thin_tac "p = polyn_expr R X (fst (s_cf R S X p)) (s_cf R S X p)", simp) apply (rule allI, rule impI, drule_tac a = j in forall_spec, assumption, simp add:subsetD) done lemma (in PolynRg) P_mod_n_1:"[|Idomain S; t ∈ carrier S; g ∈ carrier R; P_mod R S X (S ♦p (t^S (Suc n))) g|] ==> P_mod R S X (S ♦p t) g" apply (cut_tac subring, frule subring_Ring, frule Ring.npClose[of S t n], assumption+, frule Ring.npClose[of S t "Suc n"], assumption+, frule Ring.principal_ideal[of S t], assumption+, frule Ring.principal_ideal[of S "t^S (Suc n)"], assumption+) apply (case_tac "g = \<zero>R", simp add:P_mod_def) apply (frule s_cf_expr[of g], assumption, (erule conjE)+, subst P_mod_mod[THEN sym, of "S ♦p t" "g" "s_cf R S X g"], assumption+) apply (frule_tac P_mod_mod[THEN sym, of "S ♦p (t^S (Suc n))" g "s_cf R S X g"], assumption+) apply (simp del:npow_suc, thin_tac "g = polyn_expr R X (fst (s_cf R S X g)) (s_cf R S X g)") apply (rule allI, rule impI, drule_tac a = j in forall_spec, assumption+) apply (simp add:Rxa_def, erule bexE, simp, simp add:Ring.ring_tOp_assoc[THEN sym, of S], frule_tac x = r and y = "t^S n" in Ring.ring_tOp_closed, assumption+, blast) done lemma (in PolynRg) P_mod_n_m:"[|Idomain S; t ∈ carrier S; g ∈ carrier R; m ≤ n; P_mod R S X (S ♦p (t^S (Suc n))) g|] ==> P_mod R S X (S ♦p (t^S (Suc m))) g" apply (cut_tac subring, frule subring_Ring) apply (rule P_mod_I_J[of g "S ♦p (t^S (Suc n))" "S ♦p (t^S (Suc m))"], assumption) apply (rule Ring.principal_ideal, assumption+, rule Ring.npClose, assumption+) apply (rule Ring.principal_ideal, assumption+, rule Ring.npClose, assumption+) apply (thin_tac "P_mod R S X (S ♦p (t^S (Suc n))) g") apply (rule subsetI) apply (simp del:npow_suc add:Rxa_def, erule bexE, simp del:npow_suc) apply (frule Ring.npMulDistr[THEN sym, of S t "Suc n - Suc m" "Suc m"], assumption) apply (simp del:npow_suc, thin_tac "t^S (Suc n) = t^S (n - m) ·rS t^S (Suc m)", thin_tac "x = r ·rS (t^S (n - m) ·rS t^S (Suc m))") apply (subst Ring.ring_tOp_assoc[THEN sym, of S], assumption+, (rule Ring.npClose, assumption+)+) apply (frule_tac x = r and y = "t^S (n - m)" in Ring.ring_tOp_closed, assumption+, rule Ring.npClose, assumption+, blast) apply assumption done lemma (in PolynRg) P_mod_diff:"[|Idomain S; ideal S P; PolynRg R' (S /r P) Y; g ∈ carrier R; h ∈ carrier R|] ==> (erH R S X R' (S /r P) Y (pj S P) g = (erH R S X R' (S /r P) Y (pj S P) h)) = (P_mod R S X P (g ± -a h))" apply (cut_tac ring_is_ag, frule PolynRg.is_Ring[of R'], cut_tac subring, frule subring_Ring, frule Ring.qring_ring[of S P], assumption+, frule pj_Hom[of "S" "P"], assumption+, frule erH_rHom[of R' "S /r P" Y "pj S P"], assumption+, frule Ring.ring_is_ag[of R']) apply (frule erH_mem[of R' "S /r P" Y "pj S P" g], assumption+, frule erH_mem[of R' "S /r P" Y "pj S P" h], assumption+) apply (rule iffI) apply (frule_tac a = "erH R S X R' (S /r P) Y (pj S P) g" and b = "erH R S X R' (S /r P) Y (pj S P) h" in aGroup.ag_eq_diffzero[of R'], assumption+, simp, simp add:erH_minus[THEN sym, of R' "S /r P" Y "pj S P" h], drule sym, simp, thin_tac "erH R S X R' (S /r P) Y (pj S P) h = erH R S X R' (S /r P) Y (pj S P) g", frule_tac x = h in aGroup.ag_mOp_closed, assumption+, simp add:erH_add[THEN sym, of R' "S /r P" Y "pj S P" g "-a h"]) apply (subst P_mod_0[THEN sym, of P R' Y "g ± -a h"], assumption+, rule aGroup.ag_pOp_closed, assumption+) apply (frule_tac a = "erH R S X R' (S /r P) Y (pj S P) g" and b = "erH R S X R' (S /r P) Y (pj S P) h" in aGroup.ag_eq_diffzero[of R'], assumption+, simp, simp add:erH_minus[THEN sym, of R' "S /r P" Y "pj S P" h]) apply (subst erH_add[THEN sym, of R' "S /r P" Y "pj S P" g "-a h"], assumption+, rule aGroup.ag_mOp_closed, assumption+) apply (subst P_mod_0[of P R' Y "g ± -a h"], assumption+, rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_mOp_closed, assumption+) done lemma (in PolynRg) P_mod_erH:"[|Idomain S; ideal S P; PolynRg R' (S /r P) Y; g ∈ carrier R; v ∈ carrier R; t ∈ P |] ==> (erH R S X R' (S /r P) Y (pj S P) g = (erH R S X R' (S /r P) Y (pj S P) (g ± (t ·r v))))" apply (cut_tac subring, frule subring_Ring, cut_tac ring_is_ag, frule Ring.ideal_subset[of S P t], assumption+, frule mem_subring_mem_ring[of S t], assumption+, frule ring_tOp_closed[of t v], assumption+) apply (subst P_mod_diff[of P R' Y g "g ± (t ·r v)"], assumption+, rule aGroup.ag_pOp_closed, assumption+) apply (simp add:aGroup.ag_p_inv, frule aGroup.ag_mOp_closed[of R g], assumption+, frule aGroup.ag_mOp_closed[of R "t ·r v"], assumption+, subst aGroup.ag_pOp_assoc[THEN sym], assumption+, simp add:aGroup.ag_r_inv1, simp add:aGroup.ag_l_zero) apply (rule P_mod_minus[of P "t ·r v"], assumption+, frule P_mod_mult1[of P "carrier S" t v], simp add:Ring.whole_ideal, assumption+, subst P_mod_coeffTr[of P t], assumption+, rule P_mod_whole[of v], assumption+, simp add:Ring.idealprod_whole_r[of S P]) done lemma (in PolynRg) coeff_principalTr:"[|t ∈ carrier S|] ==> ∀f. pol_coeff S (n, f) ∧ (∀j ≤ n. f j ∈ S ♦p t) --> (∃f'. pol_coeff S (n, f') ∧ (∀j ≤ n. f j = t ·rS (f' j)))" apply (cut_tac subring, frule subring_Ring, cut_tac ring_is_ag) apply (induct_tac n, rule allI, rule impI, erule conjE, simp add:Rxa_def, erule bexE, simp add:Ring.ring_tOp_commute[of S _ t], subgoal_tac "pol_coeff S (0, (λj. r))", subgoal_tac "t ·rS r = t ·rS ((λj. r) 0)", blast, simp, simp add:pol_coeff_def) apply (rule allI, rule impI, erule conjE, frule_tac n = n and f = f in pol_coeff_pre, subgoal_tac "∀j ≤ n. f j ∈ S ♦p t", drule_tac a = f in forall_spec, simp, erule exE, erule conjE, frule_tac c = "(Suc n, f)" and j = "Suc n" in pol_coeff_mem, simp, simp, drule_tac a = "Suc n" in forall_spec1, simp, simp add:Rxa_def, erule bexE, simp add:Ring.ring_tOp_commute[of "S" _ "t"]) apply (subgoal_tac "pol_coeff S ((Suc n), (λj. if j ≤ n then (f' j) else r)) ∧ (∀j ≤ (Suc n). f j = t ·rS ((λj. if j ≤ n then (f' j) else r) j))", blast) apply (rule conjI, simp add:pol_coeff_def, rule allI, rule impI, case_tac "j ≤ n", simp) apply simp apply (drule_tac m = j and n = n in nat_not_le, drule_tac x = n and n = j in less_Suc_le1) apply (frule_tac m = j and n = "Suc n" in le_anti_sym, assumption, simp, thin_tac "∀f. pol_coeff S (n, f) ∧ (∀j≤n. f j ∈ S ♦p t) --> (∃f'. pol_coeff S (n, f') ∧ (∀j≤n. f j = t ·rS f' j))") apply (rule allI, rule impI, drule_tac a = j in forall_spec, simp+) done lemma (in PolynRg) coeff_principal:"[|t ∈ carrier S; pol_coeff S (n, f); ∀j ≤ n. f j ∈ S ♦p t|] ==> ∃f'. pol_coeff S (n, f') ∧ (∀j ≤ n. f j = t ·rS (f' j))" apply (simp add:coeff_principalTr) done lemma (in PolynRg) Pmod_0_principal:"[|Idomain S; t ∈ carrier S; g ∈ carrier R; P_mod R S X (S ♦p t) g|] ==> ∃h∈ carrier R. g = t ·r h" apply (cut_tac subring, frule subring_Ring) apply (case_tac "g = \<zero>R", cut_tac ring_zero, frule mem_subring_mem_ring[of S t], assumption+, frule ring_times_x_0[THEN sym, of t], blast) apply (frule s_cf_expr[of g], assumption+, (erule conjE)+, frule Ring.principal_ideal[of S t], assumption, simp add:P_mod_mod[THEN sym, of "S ♦p t" g], frule coeff_principal[of t "fst (s_cf R S X g)" "snd (s_cf R S X g)"], simp add:pol_coeff_split[THEN sym], assumption+, erule exE, erule conjE) apply (frule_tac c = "(fst (s_cf R S X g), f')" and k = "fst (s_cf R S X g)" in polyn_mem, simp, subgoal_tac "g = t ·r (polyn_expr R X (fst (s_cf R S X g)) (fst (s_cf R S X g), f'))", blast) apply (subst scalar_times_pol_expr[of t "(fst (s_cf R S X g), f')" "fst (s_cf R S X g)"], assumption+, simp, drule sym, subgoal_tac "polyn_expr R X (fst (s_cf R S X g)) (s_cf R S X g) = polyn_expr R X (fst (s_cf R S X g)) (sp_cf S t (fst (s_cf R S X g), f'))", simp) apply (frule_tac c = "(fst (s_cf R S X g), f')" in sp_cf_pol_coeff[of _ t], assumption+, frule_tac d = "sp_cf S t (fst (s_cf R S X g), f')" in pol_expr_unique2[of "s_cf R S X g"], assumption+, simp, simp add:sp_cf_len, simp add:sp_cf_len, thin_tac "(g = polyn_expr R X (fst (s_cf R S X g)) (sp_cf S t (fst (s_cf R S X g), f'))) = (∀j≤fst (s_cf R S X g). t ·rS f' j = snd (sp_cf S t (fst (s_cf R S X g), f')) j)", thin_tac "polyn_expr R X (fst (s_cf R S X g)) (s_cf R S X g) = g", thin_tac "polyn_expr R X (fst (s_cf R S X g)) (fst (s_cf R S X g), f') ∈ carrier R") apply (rule allI, rule impI, drule_tac a = j in forall_spec, assumption+, simp add:sp_cf_def) done lemma (in PolynRg) Pmod0_principal_rev:"[|Idomain S; t ∈ carrier S; g ∈ carrier R; ∃h∈ carrier R. g = t ·r h|] ==> P_mod R S X (S ♦p t) g" apply (cut_tac subring, frule subring_Ring) apply (erule bexE) apply (case_tac "t = \<zero>S", frule Subring_zero_ring_zero, simp) apply (simp add:ring_times_0_x, simp add:P_mod_def) apply (case_tac "h = \<zero>R", simp, frule mem_subring_mem_ring[of S t], assumption+, simp add:ring_times_x_0, simp add:P_mod_def, cut_tac polyn_ring_integral, simp) apply (frule_tac p = h in s_cf_expr, assumption+, (erule conjE)+, frule_tac c = "s_cf R S X h" and n = "fst (s_cf R S X h)" in scalar_times_pol_expr[of t], assumption+, simp, thin_tac "g = t ·r h", drule sym, simp) apply (frule Ring.principal_ideal[of S t], assumption+, frule_tac c1 = "sp_cf S t (s_cf R S X h)" and p1 = "t ·r h" in P_mod_mod[THEN sym], frule_tac x = t in mem_subring_mem_ring, assumption, rule ring_tOp_closed, assumption+, simp add:sp_cf_pol_coeff, simp add:sp_cf_len) apply (drule sym, simp, thin_tac "P_mod R S X (S ♦p t) (t ·r h) = (∀j≤fst (sp_cf S t (s_cf R S X h)). snd (sp_cf S t (s_cf R S X h)) j ∈ S ♦p t)", thin_tac "polyn_expr R X (fst (s_cf R S X h)) (sp_cf S t (s_cf R S X h)) = t ·r h", thin_tac "polyn_expr R X (fst (s_cf R S X h)) (s_cf R S X h) = h") apply (rule allI, rule impI, simp add:sp_cf_len, subst sp_cf_def, simp, subst Rxa_def, simp, frule_tac c = "s_cf R S X h" and j = j in pol_coeff_mem, assumption) apply (simp add:Ring.ring_tOp_commute[of S t], blast) done (** NOTE. if t ≠ 0S then, deg g = deg h, because deg t = 0 **) lemma (in PolynRg) Pmod0_principal_rev1:"[|Idomain S; t ∈ carrier S; h ∈ carrier R|] ==> P_mod R S X (S ♦p t) (t ·r h)" apply (rule Pmod0_principal_rev[of t "t ·r h"], assumption+) apply (cut_tac subring, frule mem_subring_mem_ring[of S t], assumption+, simp add:ring_tOp_closed) apply blast done lemma (in PolynRg) Pmod0_principal_erH_vanish_t:"[|Idomain S; ideal S (S ♦p t); t ∈ carrier S; t ≠ \<zero>S; PolynRg R' (S /r (S ♦p t)) Y |] ==> erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) t = \<zero>R'" apply (cut_tac subring, frule subring_Ring, frule mem_subring_mem_ring[of S t], assumption+) apply (subst P_mod_0[of "S ♦p t" R' Y t], assumption+) apply (rule Pmod0_principal_rev[of t t], assumption+) apply (cut_tac ring_one, frule ring_r_one[THEN sym, of t], blast) done lemma (in PolynRg) P_mod_diffxxx1:"[|Idomain S; t ∈ carrier S; t ≠ \<zero>S; maximal_ideal S (S ♦p t); PolynRg R' (S /r (S ♦p t)) Y; f ∈ carrier R; g ∈ carrier R; h ∈ carrier R; f ≠ \<zero>; g ≠ \<zero>; h ≠ \<zero>; u ∈ carrier R; v ∈ carrier R; erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g ≠ \<zero>R'; erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h ≠ \<zero>R'; ra ∈ carrier R; f ± -a (g ·r h) = t^S m ·r ra; 0 < m; (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) u) ·rR' erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g ±R' (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) v) ·rR' erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h = erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) ra|] ==> P_mod R S X (S ♦p (t^S (Suc m))) (f ± -a ((g ± t^S m ·r v) ·r (h ± t^S m ·r u)))" apply (cut_tac is_Ring, cut_tac subring, frule subring_Ring, cut_tac ring_is_ag, frule PolynRg.is_Ring[of R' "S /r (S ♦p t)" Y], frule Ring.ring_is_ag[of R'], frule Ring.maximal_ideal_ideal[of "S" "S ♦p t"], assumption+, frule Ring.qring_ring[of S "S ♦p t"], assumption+, frule erH_rHom[of R' "S /r (S ♦p t)" Y "pj S (S ♦p t)"], assumption+, frule mem_subring_mem_ring[of S t], assumption+) apply (rule pj_Hom[of S "S ♦p t"], assumption+, frule pHom_rHom[of R' "S /r (S ♦p t)" Y "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t))"], assumption+) apply (simp del:npow_suc add:rHom_tOp[THEN sym]) apply (frule_tac ring_tOp_closed[of u g], assumption, frule_tac ring_tOp_closed[of v h], assumption) apply (simp del:npow_suc add:rHom_add[THEN sym]) apply (rotate_tac 17, drule sym) apply (frule P_mod_diff[of "S ♦p t" R' Y ra "u ·r g ± v ·r h"], assumption+) apply (rule aGroup.ag_pOp_closed, assumption+, simp del:npow_suc) apply (frule Pmod_0_principal[of t "ra ± -a (u ·r g ± v ·r h)"], assumption+) apply (rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_mOp_closed, assumption, rule aGroup.ag_pOp_closed, assumption+, erule bexE) apply (frule Ring.npClose[of S t m], assumption+, frule mem_subring_mem_ring[of S "t^S m"], assumption+, subst ring_distrib1, rule aGroup.ag_pOp_closed, assumption+, rule ring_tOp_closed, simp add:mem_subring_mem_ring, assumption+) apply (rule ring_tOp_closed, assumption+) apply (subst ring_distrib2, assumption+, rule ring_tOp_closed, assumption+ ) apply (frule_tac x = g and y = h in ring_tOp_closed, assumption+, frule_tac x = "t^S m" and y = v in ring_tOp_closed, assumption+, frule_tac x = "t^S m" and y = u in ring_tOp_closed, assumption+, frule_tac x = "t^S m ·r v" and y = h in ring_tOp_closed, assumption+) apply (subst ring_distrib2, assumption+, frule_tac x = "t^S m ·r v" and y = "t^S m ·r u" in ring_tOp_closed, assumption+) apply (subst aGroup.ag_p_inv, assumption+, rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_pOp_closed, assumption+, rule ring_tOp_closed, assumption+) apply (subst aGroup.ag_p_inv, assumption+, frule aGroup.ag_mOp_closed[of R "g ·r h"], assumption+, frule aGroup.ag_mOp_closed[of R "t^S m ·r v ·r h"], assumption+) apply (subst aGroup.ag_pOp_assoc[of R "-a (g ·r h)" " -a (t^S m ·r v ·r h)"], assumption+) apply (rule aGroup.ag_mOp_closed, assumption, rule aGroup.ag_pOp_closed, assumption, rule ring_tOp_closed, assumption+) apply (subst aGroup.ag_pOp_assoc[THEN sym], assumption+, rule aGroup.ag_pOp_closed, assumption, rule aGroup.ag_mOp_closed, assumption+, rule aGroup.ag_mOp_closed, assumption+, rule aGroup.ag_pOp_closed, assumption+, rule ring_tOp_closed, assumption+, simp del:npow_suc) apply (subst aGroup.ag_p_inv, assumption, rule ring_tOp_closed, assumption+, simp del:npow_suc add:ring_tOp_assoc[of "t^S m" v h], simp add:del:npow_suc add:ring_tOp_commute[of g "t^S m ·r u"], simp del:npow_suc add:ring_tOp_assoc[of "t^S m" u g], simp del:npow_suc add:ring_inv1_2, subst aGroup.ag_pOp_assoc[THEN sym], assumption+, rule ring_tOp_closed, assumption+) apply (rule aGroup.ag_pOp_closed, assumption+, (rule ring_tOp_closed, assumption+)+, rule aGroup.ag_mOp_closed, assumption+, (rule ring_tOp_closed, assumption+)+, rule aGroup.ag_mOp_closed, assumption+) apply (subst ring_distrib1[THEN sym, of "t^S m" ra "v ·r (-a h)"], assumption+, rule ring_tOp_closed, assumption+, rule aGroup.ag_mOp_closed, assumption+) apply (subst aGroup.ag_pOp_assoc[THEN sym], assumption+, rule ring_tOp_closed, assumption+, rule aGroup.ag_pOp_closed, assumption+, rule ring_tOp_closed, assumption+, rule aGroup.ag_mOp_closed, assumption+) apply ((rule ring_tOp_closed, assumption+)+, rule aGroup.ag_mOp_closed, assumption+, (rule ring_tOp_closed, assumption+)+, rule aGroup.ag_mOp_closed, assumption+) apply (subst ring_distrib1[THEN sym, of "t^S m"], assumption+, rule aGroup.ag_pOp_closed, assumption+, rule ring_tOp_closed, assumption+, rule aGroup.ag_mOp_closed, assumption+, rule ring_tOp_closed, assumption+, rule aGroup.ag_mOp_closed, assumption+) apply (subst ring_tOp_assoc[of "t^S m" v], assumption+, rule ring_tOp_closed, assumption+, rule aGroup.ag_mOp_closed, assumption+) apply (subst ring_distrib1[THEN sym, of "t^S m"], assumption+, rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_pOp_closed, assumption+, rule ring_tOp_closed, assumption, rule aGroup.ag_mOp_closed, assumption+, rule ring_tOp_closed, assumption, rule aGroup.ag_mOp_closed, assumption+, (rule ring_tOp_closed, assumption+)+, rule aGroup.ag_mOp_closed, assumption+) apply (frule ring_tOp_closed[of u g], assumption+, frule ring_tOp_closed[of v h], assumption+, simp del:npow_suc add:aGroup.ag_p_inv[of R "u ·r g" "v ·r h"], simp del:npow_suc add:add:ring_inv1_2, frule aGroup.ag_mOp_closed[of R g], assumption+, frule aGroup.ag_mOp_closed[of R h], assumption+, frule ring_tOp_closed[of u "-a g"], assumption+, frule ring_tOp_closed[of v "-a h"], assumption+, simp del:npow_suc add:aGroup.ag_pOp_commute[of R "u ·r (-a g)" "v ·r (-a h)"], simp del:npow_suc add:aGroup.ag_pOp_assoc[THEN sym, of R ra "v ·r (-a h)" "u ·r (-a g)"]) apply (subst ring_tOp_assoc[THEN sym, of v "t^S m" "-a u"], assumption+, rule aGroup.ag_mOp_closed, assumption+, simp only:ring_tOp_commute[of v "t^S m"], subgoal_tac "t^S m ·r v = t ·r (t^S (m - Suc 0) ·r v)", simp del:npow_suc) apply (subst ring_tOp_assoc[of t], frule mem_subring_mem_ring[of S t], assumption+, rule ring_tOp_closed) apply (frule Ring.npClose[of S t "m - Suc 0"], assumption+, simp add:mem_subring_mem_ring, assumption, rule aGroup.ag_mOp_closed, assumption+, subst ring_distrib1[THEN sym, of t], simp add:mem_subring_mem_ring, assumption+) apply ((rule ring_tOp_closed)+, frule Ring.npClose[of S t "m - Suc 0"], assumption+, simp add:mem_subring_mem_ring, assumption, rule aGroup.ag_mOp_closed, assumption+) apply (subst ring_tOp_assoc[THEN sym], frule Ring.npClose[of S t "m - Suc 0"], assumption+, simp add:mem_subring_mem_ring) apply (rule aGroup.ag_pOp_closed, assumption+, rule ring_tOp_closed, frule Ring.npClose[of S t "m - Suc 0"], assumption+, rule ring_tOp_closed, simp add:mem_subring_mem_ring, assumption, rule aGroup.ag_mOp_closed, assumption+, simp add:Subring_tOp_ring_tOp[THEN sym], simp only:npow_suc[THEN sym, of S t m]) apply (rule Pmod0_principal_rev1[of "t^S (Suc m)"], assumption+, rule Ring.npClose, assumption+, rule aGroup.ag_pOp_closed, assumption+, (rule ring_tOp_closed)+, frule Ring.npClose[of S t "m - Suc 0"], assumption+, simp add:mem_subring_mem_ring, assumption, rule aGroup.ag_mOp_closed, assumption+) apply (frule Ring.npClose[of S t "m - Suc 0"], assumption+, frule mem_subring_mem_ring[of S t], assumption, frule mem_subring_mem_ring[of S "t^S (m - Suc 0)"], assumption, simp add:ring_tOp_assoc[THEN sym], simp add:ring_tOp_commute[of t "t^S (m - Suc 0)"], subgoal_tac "t^S m = t^S (Suc (m - Suc 0))", simp del:Suc_pred add:Subring_tOp_ring_tOp, simp only:Suc_pred) done lemma (in PolynRg) P_mod_diffxxx2:"[|Idomain S; t ∈ carrier S; t ≠ \<zero>S; maximal_ideal S (S ♦p t); PolynRg R' (S /r (S ♦p t)) Y; f ∈ carrier R; g ∈ carrier R; h ∈ carrier R; deg R S X g ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g); deg R S X h + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) ≤ deg R S X f; 0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g); 0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h); rel_prime_pols R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h); P_mod R S X (S ♦p (t^S m)) (f ± -a (g ·r h)); 0 < m|] ==> ∃g1 h1. g1 ∈carrier R ∧ h1 ∈ carrier R ∧ (deg R S X g1 ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g1)) ∧ P_mod R S X (S ♦p (t^S m)) (g ± -a g1) ∧ (deg R S X h1 + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g1) ≤ deg R S X f) ∧ P_mod R S X (S ♦p (t^S m)) (h ± -a h1) ∧ P_mod R S X (S ♦p (t^S (Suc m))) (f ± (-a (g1 ·r h1)))" apply (cut_tac subring, frule subring_Ring, cut_tac ring_is_ag, frule Ring.residue_field_cd[of S "S ♦p t"], assumption+, frule Ring.maximal_ideal_ideal[of "S" "S ♦p t"], assumption+, frule pj_Hom[of "S" "S ♦p t"], assumption+, frule mem_subring_mem_ring[of S t], assumption+, frule Ring.qring_ring[of S "S ♦p t"], assumption+, frule PolynRg.pol_nonzero[of R' "S /r (S ♦p t)" Y "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g"], rule erH_mem, assumption+, frule erH_rHom_nonzero[of R' "S /r (S ♦p t)" Y "pj S (S ♦p t)" "g"], assumption+, simp add:aless_imp_le) apply (frule PolynRg.pol_nonzero[of R' "S /r (S ♦p t)" Y "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h"], rule erH_mem, assumption+, frule erH_rHom_nonzero[of R' "S /r (S ♦p t)" Y "pj S (S ♦p t)" "h"], assumption+, simp add:aless_imp_le, simp del:npow_suc add:aless_imp_le) apply ( frule pol_nonzero[THEN sym, of "h"], simp del:npow_suc, frule aadd_pos_poss[of "deg R S X h" "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)"], assumption+, frule aless_le_trans[of "0" "(deg R S X h) + (deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g))" "deg R S X f"], assumption+, frule pol_nonzero[of f], simp del:npow_suc add:aless_imp_le) apply (thin_tac "0 < deg R S X f", thin_tac "0 < deg R S X h + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)") apply (frule Pmod_0_principal[of "t^S m" "f ± -a (g ·r h)"], rule Ring.npClose, assumption+) apply (rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_mOp_closed, assumption+, rule ring_tOp_closed, assumption+, erule bexE, rename_tac ra) (******* deg (t^S m) ra ≤ deg f ******) apply (frule deg_mult_pols1 [of g h], assumption+, frule aadd_le_mono[of "deg R S X g" "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)" "deg R S X h"]) apply (simp only:aadd_commute[of "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)" "deg R S X h"]) apply (frule ale_trans[of "deg R S X g + deg R S X h" "deg R S X h + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)" "deg R S X f"], assumption+) apply (thin_tac "deg R S X g + deg R S X h ≤ deg R S X h + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)") apply (frule_tac ring_tOp_closed[of g h], assumption+, frule deg_minus_eq1[of "g ·r h"], frule polyn_deg_add4[of "f" "-a (g ·r h)" "deg_n R S X f"], rule aGroup.ag_mOp_closed, assumption+) apply (subst deg_an[THEN sym], assumption+, simp del:npow_suc) apply (simp add:deg_an[THEN sym], simp del:npow_suc add:deg_an[THEN sym], thin_tac "deg R S X (g ·r h) = deg R S X g + deg R S X h", thin_tac "deg R S X g + deg R S X h ≤ deg R S X f", thin_tac "deg R S X (-a (g ·r h)) = deg R S X g + deg R S X h") (******* deg (t^S m) ra ≤ deg f done *** next show deg ra ≤ deg f ***) apply (frule Ring.npClose[of S t m], assumption, frule Idomain.idom_potent_nonzero[of S t m], assumption+, frule_tac p = ra in const_times_polyn1[of _ "t^S m"], assumption+, simp del:npow_suc) (****************** got deg ra ≤ deg f ***********************) (****** make g1 and h1 ******) apply (frule_tac h = "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) ra" in PolynRg.rel_prime_equation[of R' "(S /r (S ♦p t))" "Y" "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g" "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h"], assumption+, simp del:npow_suc add:erH_mem, simp del:npow_suc add:erH_mem, assumption+, simp del:npow_suc add:erH_mem) apply (erule bexE, erule bexE, (erule conjE)+, frule_tac erH_mem[of R' "S /r (S ♦p t)" Y "pj S (S ♦p t)" "g"], assumption+, frule_tac erH_mem[of R' "S /r (S ♦p t)" Y "pj S (S ♦p t)" "h"], assumption+) apply (rename_tac ra u' v') apply (frule_tac g' = v' in erH_inv[of "S ♦p t" R' Y], assumption+, simp add:PolynRg.is_Ring[of R'], assumption+) apply (frule_tac g' = u' in erH_inv[of "S ♦p t" R' Y ], assumption+, simp add:PolynRg.is_Ring[of R'], assumption+) apply ((erule bexE)+, rename_tac ra u' v' v u, (erule conjE)+) apply ( frule_tac p1 = u in erH_mult[THEN sym, of R' "S /r (S ♦p t)" Y "pj S (S ♦p t)" _ "g"], assumption+, frule_tac p1 = v in erH_mult[THEN sym, of R' "S /r (S ♦p t)" Y "pj S (S ♦p t)" _ "h"], assumption+, thin_tac "0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)", thin_tac "0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h)", thin_tac "rel_prime_pols R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h)") apply (subgoal_tac "g ± (t^S m) ·r v ∈ carrier R ∧ h ± (t^S m) ·r u ∈ carrier R ∧ deg R S X (g ± (t^S m) ·r v) ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (g ± (t^S m) ·r v)) ∧ P_mod R S X (S ♦p (t^S m)) (g ± -a (g ± (t^S m) ·r v)) ∧ deg R S X (h ± (t^S m) ·r u) + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (g ± (t^S m) ·r v)) ≤ deg R S X f ∧ P_mod R S X (S ♦p (t^S m)) ( h ± -a (h ± (t^S m) ·r u)) ∧ P_mod R S X (S ♦p (t^S (Suc m))) ( f ± -a ((g ± (t^S m) ·r v) ·r (h ± (t^S m) ·r u)))") apply (thin_tac "deg R S X h + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) ≤ deg R S X f", thin_tac "deg R' (S /r (S ♦p t)) Y u' ≤ amax (deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) ra) - deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)) (deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h))", thin_tac "deg R' (S /r (S ♦p t)) Y v' ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)", thin_tac "u' ·rR' erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g ±R' v' ·rR' erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h = erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) ra", thin_tac "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g ∈ carrier R'", thin_tac "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h ∈ carrier R'", thin_tac "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) v = v'", thin_tac "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) u = u'", thin_tac "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) u ·rR' erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g = erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (u ·r g)", thin_tac "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) v ·rR' erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h = erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (v ·r h)") apply blast apply (frule mem_subring_mem_ring[of "S" "t^S m"], assumption) apply (rule conjI) apply (rule aGroup.ag_pOp_closed, assumption+, rule ring_tOp_closed, assumption+) apply (rule conjI, rule aGroup.ag_pOp_closed, assumption+, rule ring_tOp_closed, assumption+) apply (frule Ring.a_in_principal[of "S" "t"], assumption+, frule Ring.maximal_ideal_ideal[of "S" "S ♦p t"], assumption+, frule Ring.ideal_npow_closed[of "S" "S ♦p t" "t" "m"], assumption+, frule PolynRg.is_Ring[of R' "S /r (S ♦p t)" Y], frule Ring.ring_is_ag[of R'], frule erH_rHom[of R' "S /r (S ♦p t)" Y "pj S (S ♦p t)"], assumption+) apply (rule conjI) apply (frule pHom_dec_deg[of R' "S /r (S ♦p t)" Y "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t))" g], assumption+, frule_tac i = "deg R S X v" and j = "deg R' (S /r (S ♦p t)) Y v'" and k = "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)" in ale_trans, assumption, thin_tac "deg R' (S /r (S ♦p t)) Y u' ≤ amax (deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) ra) - deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)) (deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h))", thin_tac "u' ·rR' erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g ±R' v' ·rR' erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h = erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) ra", thin_tac "deg R S X h + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) ≤ deg R S X f") apply (subst P_mod_erH[THEN sym, of "S ♦p t" "R'" "Y" "g" _ "t^S m"], assumption+, thin_tac "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) ≤ deg R S X g") apply (frule_tac p = v in const_times_polyn1[of _ "t^S m"], assumption+, frule_tac q = "(t^S m) ·r v" in polyn_deg_add4[of "g" _ "deg_n R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)"]) apply (rule ring_tOp_closed, assumption+, simp del:npow_suc add:PolynRg.deg_an[THEN sym], simp add:PolynRg.deg_an[THEN sym], simp add:PolynRg.deg_an[THEN sym]) apply (rule conjI) apply (frule Ring.principal_ideal[of S "t^S m"], assumption+, frule Ring.a_in_principal[of S "t^S m"], assumption+) apply (frule_tac y = v in ring_tOp_closed[of "t^S m"], assumption+, subst aGroup.ag_p_inv, assumption+, frule aGroup.ag_mOp_closed[of "R" "g"], assumption+, frule_tac x = "(t^S m) ·r v" in aGroup.ag_mOp_closed[of "R"], assumption+) apply (subst aGroup.ag_pOp_assoc[THEN sym], assumption+, subst aGroup.ag_r_inv1[of "R"], assumption+, subst aGroup.ag_l_zero[of "R"], assumption+, rule P_mod_minus, assumption+) apply (rule_tac g = "(t^S m) ·r v" in Pmod0_principal_rev[of "t^S m"], assumption+) apply blast apply (rule conjI) apply (subst P_mod_erH[THEN sym, of "S ♦p t" R' Y g _ "t^S m"], assumption+, thin_tac "P_mod R S X (S ♦p (t^S m)) (t^S m ·r ra)", thin_tac "f ± -a (g ·r h) = t^S m ·r ra", thin_tac "u' ·rR' erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g ±R' v' ·rR' erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h = erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) ra") apply (case_tac " (deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) ra) - deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)) ≤ (deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h))") apply (simp add:amax_def) apply (frule_tac i = "deg R S X u" and j = "deg R' (S /r (S ♦p t)) Y u'" and k = "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h)" in ale_trans, assumption+, frule pHom_dec_deg[of R' "S /r (S ♦p t)" Y "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t))" h], assumption+, frule_tac i = "deg R S X u" and j = "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h)" and k = "deg R S X h" in ale_trans, assumption+, frule_tac p = u and c = "t^S m" in const_times_polyn1, assumption+) apply (frule_tac q = "(t^S m) ·r u" in polyn_deg_add4[of h _ "deg_n R S X h"], rule ring_tOp_closed, assumption+, subst deg_an[THEN sym], assumption+, rule ale_refl, subst deg_an[THEN sym], assumption+, simp, frule deg_an[THEN sym, of h], assumption+, simp) apply (frule_tac x = "deg R S X ( h ± (t^S m) ·r u)" in aadd_le_mono[of _ "deg R S X h" "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)"], rule_tac i = "deg R S X ( h ± (t^S m) ·r u) + (deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g))" in ale_trans[of _ "deg R S X h + (deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g))" "deg R S X f"], assumption+) apply (simp add:amax_def) apply (thin_tac "¬ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) ra) - deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h)") apply (subst aplus_le_aminus[of _ "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)" "deg R S X f"]) apply (rule deg_in_aug_minf, rule aGroup.ag_pOp_closed, assumption+, rule ring_tOp_closed, assumption+, rule PolynRg.deg_in_aug_minf, assumption+, rule deg_in_aug_minf, assumption+) apply (subst PolynRg.deg_an, assumption+, simp add:minus_an_in_aug_minf, frule_tac y = u in ring_tOp_closed[of "t^S m"], assumption+, frule_tac q = "(t^S m) ·r u" in polyn_deg_add5[of h _ "deg R S X f - deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)"], assumption+, frule deg_in_aug_minf[of h], subst aplus_le_aminus[THEN sym, of "deg R S X h" "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)" "deg R S X f"], assumption+, rule PolynRg.deg_in_aug_minf, assumption+, rule deg_in_aug_minf, assumption+, subst PolynRg.deg_an, assumption+, simp add:minus_an_in_aug_minf, assumption) apply (subst const_times_polyn1, assumption+, frule_tac i = "deg R S X u" and j = "deg R' (S /r (S ♦p t)) Y u'" and k = "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) ra) - deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)" in ale_trans, assumption+, frule_tac p = ra in pHom_dec_deg[of R' "S /r (S ♦p t)" Y "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t))"], assumption+, frule_tac i = "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) ra)" and j = "deg R S X ra" and k = "deg R S X f" in ale_trans, assumption+, frule_tac a = "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) ra)" and a' = "deg R S X f" and b = "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)" in adiff_le_adiff, frule_tac i = "deg R S X u" and j = "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) ra) - deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)" and k = "deg R S X f - deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)" in ale_trans, assumption+) apply (rule conjI) apply (frule Ring.principal_ideal[of "S" "t^S m"], assumption+, frule Ring.a_in_principal[of "S" "t^S m"], assumption+, frule_tac y = u in ring_tOp_closed[of "t^S m"], assumption+, subst aGroup.ag_p_inv, assumption+, frule aGroup.ag_mOp_closed[of "R" "g"], assumption+, frule_tac x = "(t^S m) ·r u" in aGroup.ag_mOp_closed[of "R"], assumption+, subst aGroup.ag_pOp_assoc[THEN sym], assumption+, rule aGroup.ag_mOp_closed, assumption+, subst aGroup.ag_r_inv1[of "R"], assumption+, subst aGroup.ag_l_zero[of "R"], assumption+, rule P_mod_minus, assumption+, rule_tac g = "(t^S m) ·r u" in Pmod0_principal_rev[of "t^S m"], assumption+, thin_tac "deg R S X g ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)", thin_tac "deg R S X h + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) ≤ deg R S X f", thin_tac "deg R' (S /r (S ♦p t)) Y u' ≤ amax (deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) ra) - deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)) (deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h))", thin_tac "deg R' (S /r (S ♦p t)) Y v' ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)", thin_tac " u' ·rR' erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g ±R' v' ·rR' erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h = erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) ra", thin_tac "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) u ·rR' erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g = erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (u ·r g)", thin_tac "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) v ·rR' erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h = erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (v ·r h)") apply blast apply (rule_tac u = u and v = v and ra = ra in P_mod_diffxxx1[of t R' Y f g h], assumption+) apply (rotate_tac -12, drule sym, drule sym, simp) done (** Hensel_next R S X t R' Y f m gh **) constdefs Hensel_next::"[('a, 'b) Ring_scheme, ('a, 'c) Ring_scheme, 'a, 'a, ('a set, 'm) Ring_scheme, 'a set,'a, nat] => ('a × 'a) => ('a × 'a)" ("(9Hen _ _ _ _ _ _ _ _ _)" [67,67,67,67,67,67,67,68]67) "HenR S X t R' Y f m gh == SOME gh1. gh1 ∈ carrier R × carrier R ∧ (deg R S X (fst gh1) ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh1))) ∧ P_mod R S X (S ♦p (t^S m)) ((fst gh) ±R -aR (fst gh1)) ∧ (deg R S X (snd gh1) + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh1)) ≤ deg R S X f) ∧ P_mod R S X (S ♦p (t^S m)) ((snd gh) ±R -aR (snd gh1)) ∧ P_mod R S X (S ♦p (t^S (Suc m))) (f ±R (-aR ((fst gh1) ·rR (snd gh1))))" lemma cart_prod_fst:"x ∈ A × B ==> fst x ∈ A" by auto lemma cart_prod_snd:"x ∈ A × B ==> snd x ∈ B" by auto lemma cart_prod_split:"((x,y) ∈ A × B) = (x ∈ A ∧ y ∈ B)" by auto lemma (in PolynRg) P_mod_diffxxx3:"[|Idomain S; t ∈ carrier S; t ≠ \<zero>S; maximal_ideal S (S ♦p t); PolynRg R' (S /r (S ♦p t)) Y; f ∈ carrier R; gh ∈ carrier R × carrier R; deg R S X (fst gh) ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh)); deg R S X (snd gh) + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh)) ≤ deg R S X f; 0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh)); 0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd gh)); rel_prime_pols R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh)) (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd gh)); P_mod R S X (S ♦p (t^S m)) (f ± -a ((fst gh) ·r (snd gh))); 0 < m|] ==> ∃gh1. gh1 ∈carrier R × carrier R ∧ (deg R S X (fst gh1) ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh1))) ∧ P_mod R S X (S ♦p (t^S m)) ((fst gh) ± -a (fst gh1)) ∧ (deg R S X (snd gh1) + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh1)) ≤ deg R S X f) ∧ P_mod R S X (S ♦p (t^S m)) ((snd gh) ± -a (snd gh1)) ∧ P_mod R S X (S ♦p (t^S (Suc m))) (f ± (-a ((fst gh1) ·r (snd gh1))))" apply (cases gh) apply (simp del: npow_suc) apply (rename_tac g h) apply (erule conjE, frule_tac g = g and h = h and f = f in P_mod_diffxxx2[of t R' Y], assumption+) apply blast done lemma (in PolynRg) P_mod_diffxxx4:"[|Idomain S; t ∈ carrier S; t ≠ \<zero>S; maximal_ideal S (S ♦p t); PolynRg R' (S /r (S ♦p t)) Y; f ∈ carrier R; gh ∈ carrier R × carrier R; deg R S X (fst gh) ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh)); deg R S X (snd gh) + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh)) ≤ deg R S X f; 0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh)); 0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd gh)); rel_prime_pols R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh)) (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd gh)); P_mod R S X (S ♦p (t^S m)) (f ± -a ((fst gh) ·r (snd gh))); 0 < m|] ==> (HenR S X t R' Y f m gh) ∈ carrier R × carrier R ∧ (deg R S X (fst (HenR S X t R' Y f m gh)) ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (HenR S X t R' Y f m gh)))) ∧ P_mod R S X (S ♦p (t^S m)) ((fst gh) ± -a (fst (HenR S X t R' Y f m gh))) ∧ (deg R S X (snd (HenR S X t R' Y f m gh)) + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (HenR S X t R' Y f m gh))) ≤ deg R S X f) ∧ P_mod R S X (S ♦p (t^S m)) ((snd gh) ± -a (snd (HenR S X t R' Y f m gh))) ∧ P_mod R S X (S ♦p (t^S (Suc m))) (f ± (-a ((fst (HenR S X t R' Y f m gh)) ·r (snd (HenR S X t R' Y f m gh)))))" apply (unfold Hensel_next_def) apply (rule someI2_ex) apply (rule P_mod_diffxxx3, assumption+) done (* Hensel_pair R S X t R' Y f g h m *) consts Hensel_pair::"[('a, 'b) Ring_scheme, ('a, 'c) Ring_scheme, 'a, 'a, ('a set, 'm) Ring_scheme, 'a set, 'a, 'a, 'a, nat] => ('a × 'a)" ("(10Hpr _ _ _ _ _ _ _ _ _ _)" [67,67,67,67,67,67,67,67,67,68]67) primrec Hpr_0: "HprR S X t R' Y f g h 0 = (g, h)" Hpr_Suc: "HprR S X t R' Y f g h (Suc m) = HenR S X t R' Y f (Suc m) (HprR S X t R' Y f g h m)" lemma (in PolynRg) fst_xxx:" [|t ∈ carrier S; t ≠ \<zero>S; ideal S (S ♦p t); ∀(n::nat). (F n) ∈ carrier R × carrier R; ∀m. P_mod R S X (S ♦p t) (fst (F m) ± -a (fst (F (Suc m))))|] ==> P_mod R S X (S ♦p t) (fst (F 0) ± -a (fst (F n)))" apply (cut_tac subring, frule subring_Ring, cut_tac ring_is_ag) apply (induct_tac n) apply (drule_tac m = 0 in nat_forall_spec) apply (frule cart_prod_fst[of "F 0" "carrier R" "carrier R"]) apply (simp add:aGroup.ag_r_inv1) apply (simp add:P_mod_def) apply (frule_tac m = 0 in nat_forall_spec, frule_tac m = n in nat_forall_spec, drule_tac m = "Suc n" in nat_forall_spec) apply (frule_tac x = "F 0" in cart_prod_fst[of _ "carrier R" "carrier R"], frule_tac x = "F n" in cart_prod_fst[of _ "carrier R" "carrier R"], frule_tac x = "F (Suc n)" in cart_prod_fst[of _ "carrier R" "carrier R"]) apply (drule_tac m = n in nat_forall_spec) apply (frule_tac p = "fst (F 0) ± -a (fst (F n))" and q = "fst (F n) ± -a (fst (F (Suc n)))" in P_mod_add[of "S ♦p t"]) apply (rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_mOp_closed, assumption+)+ apply (frule_tac x = "fst (F n)" in aGroup.ag_mOp_closed, assumption+, frule_tac x = "fst (F (Suc n))" in aGroup.ag_mOp_closed, assumption+) apply (simp add:aGroup.pOp_assocTr41[of "R", THEN sym], simp add:aGroup.pOp_assocTr42[of "R"], simp add:aGroup.ag_l_inv1, simp add:aGroup.ag_r_zero) done lemma (in PolynRg) snd_xxx:"[|t ∈ carrier S; t ≠ \<zero>S; ideal S (S ♦p t); ∀(n::nat). (F n) ∈ carrier R × carrier R; ∀m. P_mod R S X (S ♦p t) (snd (F m) ± -a (snd (F (Suc m))))|] ==> P_mod R S X (S ♦p t) (snd (F 0) ± -a (snd (F n)))" apply (cut_tac subring, frule subring_Ring, cut_tac ring_is_ag) apply (induct_tac n) apply (drule_tac m = 0 in nat_forall_spec) apply (frule cart_prod_snd[of "F 0" "carrier R" "carrier R"]) apply (simp add:aGroup.ag_r_inv1) apply (simp add:P_mod_def) apply (frule_tac m = 0 in nat_forall_spec, frule_tac m = n in nat_forall_spec, drule_tac m = "Suc n" in nat_forall_spec) apply (frule_tac x = "F 0" in cart_prod_snd[of _ "carrier R" "carrier R"], frule_tac x = "F n" in cart_prod_snd[of _ "carrier R" "carrier R"], frule_tac x = "F (Suc n)" in cart_prod_snd[of _ "carrier R" "carrier R"]) apply (drule_tac m = n in nat_forall_spec) apply (frule_tac p = "snd (F 0) ± -a (snd (F n))" and q = "snd (F n) ± -a (snd (F (Suc n)))" in P_mod_add[of "S ♦p t"]) apply (rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_mOp_closed, assumption+)+ apply (frule_tac x = "snd (F n)" in aGroup.ag_mOp_closed, assumption+, frule_tac x = "snd (F (Suc n))" in aGroup.ag_mOp_closed, assumption+) apply (simp add:aGroup.pOp_assocTr41[of "R", THEN sym], simp add:aGroup.pOp_assocTr42[of "R"], simp add:aGroup.ag_l_inv1, simp add:aGroup.ag_r_zero) done lemma (in PolynRg) P_mod_diffxxx5:"[|Idomain S; t ∈ carrier S; t ≠ \<zero>S; maximal_ideal S (S ♦p t); PolynRg R' (S /r (S ♦p t)) Y; f ∈ carrier R; (g, h) ∈ carrier R × carrier R; deg R S X (fst (g, h)) ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (g, h))); deg R S X (snd (g, h)) + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (g, h))) ≤ deg R S X f; 0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (g, h))); 0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd (g, h))); rel_prime_pols R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (g, h))) (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd (g, h))); P_mod R S X (S ♦p t) (f ± -a (g ·r h))|] ==> (HprR S X t R' Y f g h (Suc m)) ∈ carrier R × carrier R ∧ erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (HprR S X t R' Y f g h (Suc m))) = erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (g, h)) ∧ erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd (HprR S X t R' Y f g h (Suc m))) = erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd (g, h)) ∧ (deg R S X (fst (HprR S X t R' Y f g h (Suc m))) ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (HprR S X t R' Y f g h (Suc m))))) ∧ P_mod R S X (S ♦p (t^S (Suc m))) ((fst (HprR S X t R' Y f g h m)) ± -a (fst (HprR S X t R' Y f g h (Suc m)))) ∧ (deg R S X (snd (HprR S X t R' Y f g h (Suc m))) + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (HprR S X t R' Y f g h (Suc m)))) ≤ deg R S X f) ∧ P_mod R S X (S ♦p (t^S (Suc m))) ((snd (HprR S X t R' Y f g h m)) ± -a (snd (HprR S X t R' Y f g h (Suc m)))) ∧ P_mod R S X (S ♦p (t^S (Suc (Suc m)))) (f ± -a ((fst (HprR S X t R' Y f g h (Suc m))) ·r (snd (HprR S X t R' Y f g h (Suc m)))))" apply (cut_tac subring, frule subring_Ring, cut_tac ring_is_ag, frule mem_subring_mem_ring[of S t], assumption+, frule Ring.maximal_ideal_ideal[of S "S ♦p t"], assumption+) apply (induct_tac m) apply (simp del:Hpr_0 npow_suc) apply (simp only:Hpr_0) apply (frule P_mod_diffxxx4[of t R' Y f "(g, h)" "Suc 0"], assumption+) apply (simp add:cart_prod_split, simp+) apply (simp add:Ring.ring_l_one, simp) apply (simp add:Ring.ring_l_one, (erule conjE)+) apply (frule P_mod_diff[THEN sym, of "S ♦p t" R' Y g "fst (Hen R S X t R' Y f (Suc 0) (g, h))"], assumption+, simp add:cart_prod_fst, rotate_tac -1, drule sym, simp) apply (frule P_mod_diff[THEN sym, of "S ♦p t" R' Y h "snd (Hen R S X t R' Y f (Suc 0) (g, h))"], assumption+, simp add:cart_prod_snd, rotate_tac -1, drule sym, simp) apply ((erule conjE)+, rename_tac m) apply (frule_tac m = "Suc (Suc m)" and gh = "Hpr R S X t R' Y f g h (Suc m)" in P_mod_diffxxx4[of t R' Y f], assumption+) apply (simp, simp, simp, simp del:npow_suc, simp) apply (erule conjE)+ apply (simp del:npow_suc del:Hpr_Suc add:Hpr_Suc[THEN sym, of R S X t R' Y f _ g h]) apply (thin_tac "deg R S X g ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)", thin_tac "deg R S X h + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) ≤ deg R S X f", thin_tac "0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)", thin_tac "0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h)", thin_tac "rel_prime_pols R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h)", thin_tac "deg R S X (fst (Hpr R S X t R' Y f g h Suc m)) ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)", thin_tac "deg R S X (snd (Hpr R S X t R' Y f g h Suc m)) + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) ≤ deg R S X f", thin_tac "deg R S X (fst (Hpr R S X t R' Y f g h Suc (Suc m))) ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (Hpr R S X t R' Y f g h Suc (Suc m))))", thin_tac "deg R S X (snd (Hpr R S X t R' Y f g h Suc (Suc m))) + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (Hpr R S X t R' Y f g h Suc (Suc m)))) ≤ deg R S X f") apply (frule_tac g = "fst (Hpr R S X t R' Y f g h (Suc m)) ± -a (fst (Hpr R S X t R' Y f g h (Suc (Suc m))))" and n = "Suc m" in P_mod_n_1 [of t], assumption+, (rule aGroup.ag_pOp_closed, assumption+, simp add:cart_prod_fst, rule aGroup.ag_mOp_closed, assumption+, simp add:cart_prod_fst, assumption), (frule_tac x = "Hpr R S X t R' Y f g h Suc m" in cart_prod_fst[of _ "carrier R" "carrier R"], frule_tac x = "Hpr R S X t R' Y f g h (Suc (Suc m))" in cart_prod_fst[of _ "carrier R" "carrier R"]), (frule_tac g1 = "fst (Hpr R S X t R' Y f g h (Suc m))" and h1 = "fst (Hpr R S X t R' Y f g h (Suc (Suc m)))" in P_mod_diff[THEN sym, of "S ♦p t" R' Y], assumption+)) apply (frule_tac g = "snd (Hpr R S X t R' Y f g h (Suc m)) ± -a (snd (Hpr R S X t R' Y f g h (Suc (Suc m))))" and n = "Suc m" in P_mod_n_1 [of t], assumption+, (rule aGroup.ag_pOp_closed, assumption+, simp add:cart_prod_snd, rule aGroup.ag_mOp_closed, assumption+, simp add:cart_prod_snd, assumption), (frule_tac x = "Hpr R S X t R' Y f g h Suc m" in cart_prod_snd[of _ "carrier R" "carrier R"], frule_tac x = "Hpr R S X t R' Y f g h (Suc (Suc m))" in cart_prod_snd[of _ "carrier R" "carrier R"]), (frule_tac g1 = "snd (Hpr R S X t R' Y f g h (Suc m))" and h1 = "snd (Hpr R S X t R' Y f g h (Suc (Suc m)))" in P_mod_diff[THEN sym, of "S ♦p t" R' Y], assumption+)) apply simp done (*** Hensel_pair basic ***) lemma (in PolynRg) P_mod_diffxxx5_1:"[|Idomain S; t ∈ carrier S; t ≠ \<zero>S; maximal_ideal S (S ♦p t); PolynRg R' (S /r (S ♦p t)) Y; f ∈ carrier R; g ∈ carrier R; h ∈ carrier R; deg R S X g ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g); deg R S X h + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) ≤ deg R S X f; 0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g); 0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h); rel_prime_pols R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h); P_mod R S X (S ♦p t) (f ± -a (g ·r h))|] ==> (HprR S X t R' Y f g h (Suc m)) ∈ carrier R × carrier R ∧ erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (HprR S X t R' Y f g h (Suc m))) = erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (g, h)) ∧ erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd (HprR S X t R' Y f g h (Suc m))) = erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd (g, h)) ∧ (deg R S X (fst (HprR S X t R' Y f g h (Suc m))) ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (HprR S X t R' Y f g h (Suc m))))) ∧ P_mod R S X (S ♦p (t^S (Suc m))) ((fst (HprR S X t R' Y f g h m)) ± -a (fst (HprR S X t R' Y f g h (Suc m)))) ∧ (deg R S X (snd (HprR S X t R' Y f g h (Suc m))) + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (HprR S X t R' Y f g h (Suc m)))) ≤ deg R S X f) ∧ P_mod R S X (S ♦p (t^S (Suc m))) ((snd (HprR S X t R' Y f g h m)) ± -a (snd (HprR S X t R' Y f g h (Suc m)))) ∧ P_mod R S X (S ♦p (t^S (Suc (Suc m)))) (f ± -a ((fst (HprR S X t R' Y f g h (Suc m))) ·r (snd (HprR S X t R' Y f g h (Suc m)))))" apply (frule P_mod_diffxxx5[of t R' Y f g h m], assumption+) apply (simp add:cart_prod_split, simp, simp, simp, simp, simp, assumption+) done (*** Hpr sequence of polynomial pair ***) lemma (in PolynRg) P_mod_diffxxx5_2:"[|Idomain S; t ∈ carrier S; t ≠ \<zero>S; maximal_ideal S (S ♦p t); PolynRg R' (S /r (S ♦p t)) Y; f ∈ carrier R; g ∈ carrier R; h ∈ carrier R; deg R S X g ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g); deg R S X h + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) ≤ deg R S X f; 0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g); 0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h); rel_prime_pols R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h); P_mod R S X (S ♦p t) (f ± -a (g ·r h))|] ==> (HprR S X t R' Y f g h m) ∈ carrier R × carrier R" apply (case_tac "m = 0", simp, simp) apply (frule P_mod_diffxxx5_1[of t R' Y f g h "m - Suc 0"], assumption+) apply (erule conjE)+ apply simp done (*** Cauchy 1***) lemma (in PolynRg) P_mod_diffxxx5_3:"[|Idomain S; t ∈ carrier S; t ≠ \<zero>S; maximal_ideal S (S ♦p t); PolynRg R' (S /r (S ♦p t)) Y; f ∈ carrier R; g ∈ carrier R; h ∈ carrier R; deg R S X g ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g); deg R S X h + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) ≤ deg R S X f; 0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g); 0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h); rel_prime_pols R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h); P_mod R S X (S ♦p t) (f ± -a (g ·r h))|] ==> P_mod R S X (S ♦p (t^S m)) ((fst (HprR S X t R' Y f g h m)) ± -a (fst (HprR S X t R' Y f g h (m + n)))) ∧ P_mod R S X (S ♦p (t^S m)) ((snd (HprR S X t R' Y f g h m)) ± -a (snd (HprR S X t R' Y f g h (m + n))))" apply (cut_tac ring_is_ag, cut_tac subring, frule subring_Ring) apply (induct_tac n) apply (simp del:npow_suc Hpr_Suc) apply (frule P_mod_diffxxx5_2[of t R' Y f g h m], assumption+) apply (frule cart_prod_fst[of "Hpr R S X t R' Y f g h m" "carrier R" "carrier R"], frule cart_prod_snd[of "Hpr R S X t R' Y f g h m" "carrier R" "carrier R"]) apply (simp add:aGroup.ag_r_inv1, simp add:P_mod_def) apply (frule_tac m = "m + n" in P_mod_diffxxx5_1[of t R' Y f g h], assumption+, (erule conjE)+) apply (frule_tac m = m in P_mod_diffxxx5_2[of t R' Y f g h], assumption+) apply (frule_tac m = "m + n" in P_mod_diffxxx5_2[of t R' Y f g h], assumption+) apply (thin_tac "deg R S X g ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)", thin_tac "deg R S X h + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) ≤ deg R S X f", thin_tac "0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)", thin_tac "0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h)", thin_tac "rel_prime_pols R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h)", thin_tac "P_mod R S X (S ♦p t) ( f ± -a (g ·r h))", thin_tac "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (Hpr R S X t R' Y f g h Suc (m + n))) = erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (g, h))", thin_tac "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd (Hpr R S X t R' Y f g h Suc (m + n))) = erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd (g, h))", thin_tac "deg R S X (fst (Hpr R S X t R' Y f g h Suc (m + n))) ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (Hpr R S X t R' Y f g h Suc (m + n))))", thin_tac "deg R S X (snd (Hpr R S X t R' Y f g h Suc (m + n))) + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (Hpr R S X t R' Y f g h Suc (m + n)))) ≤ deg R S X f", thin_tac "P_mod R S X (S ♦p (t^S (Suc (Suc (m + n))))) (f ± -a (fst (Hpr R S X t R' Y f g h Suc (m + n)) ·r snd (Hpr R S X t R' Y f g h Suc (m + n))))") apply (simp del:npow_suc Hpr_Suc) apply (frule_tac x = "Hpr R S X t R' Y f g h m" in cart_prod_fst[of _ "carrier R" "carrier R"], frule_tac x = "Hpr R S X t R' Y f g h (m + n)" in cart_prod_fst[of _ "carrier R" "carrier R"], frule_tac x = "Hpr R S X t R' Y f g h (Suc (m + n))" in cart_prod_fst[of _ "carrier R" "carrier R"], frule_tac x = "Hpr R S X t R' Y f g h m" in cart_prod_snd[of _ "carrier R" "carrier R"], frule_tac x = "Hpr R S X t R' Y f g h (m + n)" in cart_prod_snd[of _ "carrier R" "carrier R"], frule_tac x = "Hpr R S X t R' Y f g h (Suc (m + n))" in cart_prod_snd[of _ "carrier R" "carrier R"]) apply (case_tac "m = 0", simp del:npow_suc Hpr_Suc) apply (simp only:Ring.Rxa_one) apply (rule conjI) apply (rule_tac p = "g ± -a (fst (Hpr R S X t R' Y f g h (Suc n)))" in P_mod_whole, rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_mOp_closed, assumption+) apply (rule_tac p = "h ± -a (snd (Hpr R S X t R' Y f g h (Suc n)))" in P_mod_whole, rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_mOp_closed, assumption+) apply (frule_tac g = "fst (Hpr R S X t R' Y f g h (m + n)) ± -a (fst (Hpr R S X t R' Y f g h Suc (m + n)))" and n = "m + n" in P_mod_n_m[of t _ "m - Suc 0"], assumption+) apply (rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_mOp_closed, assumption+, arith, simp del:npow_suc Hpr_Suc, simp del:npow_suc Hpr_Suc) apply (frule Ring.npClose[of S t m], assumption, frule Ring.principal_ideal[of S "t^S m"], assumption) apply (frule_tac p = "fst (Hpr R S X t R' Y f g h m) ± -a (fst (Hpr R S X t R' Y f g h (m + n)))" and q = "fst (Hpr R S X t R' Y f g h (m + n)) ± -a (fst (Hpr R S X t R' Y f g h Suc (m + n)))" in P_mod_add[of "S ♦p (t^S m)"], (rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_mOp_closed, assumption+)+, simp del:npow_suc Hpr_Suc add:aGroup.pOp_assoc_cancel) apply (frule_tac g = "snd (Hpr R S X t R' Y f g h (m + n)) ± -a (snd (Hpr R S X t R' Y f g h Suc (m + n)))" and n = "m + n" in P_mod_n_m[of t _ "m - Suc 0"], assumption+) apply (rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_mOp_closed, assumption+, arith, simp del:npow_suc Hpr_Suc, simp del:npow_suc Hpr_Suc) apply (frule_tac p = "snd (Hpr R S X t R' Y f g h m) ± -a (snd (Hpr R S X t R' Y f g h (m + n)))" and q = "snd (Hpr R S X t R' Y f g h (m + n)) ± -a (snd (Hpr R S X t R' Y f g h Suc (m + n)))" in P_mod_add[of "S ♦p (t^S m)"], (rule aGroup.ag_pOp_closed, assumption+, rule aGroup.ag_mOp_closed, assumption+)+, simp del:npow_suc Hpr_Suc add:aGroup.pOp_assoc_cancel) done (*** Cauchy, deg bounded ****) lemma (in PolynRg) P_mod_diffxxx5_4:"[|Idomain S; t ∈ carrier S; t ≠ \<zero>S; maximal_ideal S (S ♦p t); PolynRg R' (S /r (S ♦p t)) Y; f ∈ carrier R; g ∈ carrier R; h ∈ carrier R; deg R S X g ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g); deg R S X h + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) ≤ deg R S X f; 0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g); 0 < deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h); rel_prime_pols R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h); P_mod R S X (S ♦p t) (f ± -a (g ·r h))|] ==> deg R S X (fst (HprR S X t R' Y f g h m)) ≤ deg R S X g ∧ deg R S X (snd (HprR S X t R' Y f g h m)) ≤ deg R S X f" apply (cut_tac subring, frule subring_Ring, frule Ring.maximal_ideal_ideal[of S "S ♦p t"], assumption) apply (case_tac "m = 0") apply simp apply (frule aless_imp_le[of "0" "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)"]) apply (frule aadd_le_mono[of "0" "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)" "deg R S X h"]) apply (simp add:aadd_0_l, simp add:aadd_commute[of _ "deg R S X h"]) apply (frule P_mod_diffxxx5_1[of t R' Y f g h "m - Suc 0"], assumption+, (erule conjE)+) apply (thin_tac "deg R S X g ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)") apply (thin_tac "deg R S X h + deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) ≤ deg R S X f") apply (thin_tac "rel_prime_pols R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h)", thin_tac "P_mod R S X (S ♦p t) ( f ± -a (g ·r h))", thin_tac "P_mod R S X (S ♦p (t^S (Suc (m - Suc 0)))) (fst (Hpr R S X t R' Y f g h (m - Suc 0)) ± -a (fst (Hpr R S X t R' Y f g h Suc (m - Suc 0))))", thin_tac "P_mod R S X (S ♦p (t^S (Suc (m - Suc 0)))) ( snd (Hpr R S X t R' Y f g h (m - Suc 0)) ± -a (snd (Hpr R S X t R' Y f g h Suc (m - Suc 0))))", thin_tac "P_mod R S X (S ♦p (t^S (Suc (Suc (m - Suc 0))))) (f ± -a (fst (Hpr R S X t R' Y f g h Suc (m - Suc 0)) ·r snd (Hpr R S X t R' Y f g h Suc (m - Suc 0))))") apply (simp del:npow_suc Hpr_Suc) apply (thin_tac "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (Hpr R S X t R' Y f g h m)) = erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g", thin_tac "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd (Hpr R S X t R' Y f g h m)) = erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h") apply (frule_tac p = g in pHom_dec_deg[of R' "(S /r (S ♦p t))" Y "erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t))"]) apply (frule Ring.qring_ring[of "S" "S ♦p t"], assumption+) apply (rule erH_rHom[of R' "(S /r (S ♦p t))" Y "pj S (S ♦p t)"], assumption+, simp add:pj_Hom, assumption+) apply (frule ale_trans[of "deg R S X (fst (Hpr R S X t R' Y f g h m))" "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)" "deg R S X g"], assumption+) apply simp apply (thin_tac "deg R S X (fst (Hpr R S X t R' Y f g h m)) ≤ deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)", thin_tac "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g) ≤ deg R S X g", thin_tac "deg R S X (fst (Hpr R S X t R' Y f g h m)) ≤ deg R S X g") apply (frule aless_imp_le[of "0" "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)"]) apply (frule aadd_le_mono[of "0" "deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)" "deg R S X (snd (Hpr R S X t R' Y f g h m))"]) apply (simp add:aadd_0_l, simp add:aadd_commute[of _ "deg R S X (snd (Hpr R S X t R' Y f g h m))"]) done end
lemma lcf_val_0:
lcf R S X \<zero> = \<zero>S
lemma lcf_val:
[| p ∈ carrier R; p ≠ \<zero> |]
==> lcf R S X p = snd (s_cf R S X p) (fst (s_cf R S X p))
lemma s_cf_pol_coeff:
p ∈ carrier R ==> pol_coeff S (s_cf R S X p)
lemma lcf_mem:
p ∈ carrier R ==> lcf R S X p ∈ carrier S
lemma s_cf_expr0:
p ∈ carrier R
==> pol_coeff S (s_cf R S X p) ∧
p = polyn_expr R X (fst (s_cf R S X p)) (s_cf R S X p)
lemma pos_deg_nonzero:
[| p ∈ carrier R; 0 < deg_n R S X p |] ==> p ≠ \<zero>
lemma s_cf_expr:
[| p ∈ carrier R; p ≠ \<zero> |]
==> pol_coeff S (s_cf R S X p) ∧
p = polyn_expr R X (fst (s_cf R S X p)) (s_cf R S X p) ∧
snd (s_cf R S X p) (fst (s_cf R S X p)) ≠ \<zero>S
lemma lcf_nonzero:
[| p ∈ carrier R; p ≠ \<zero> |] ==> lcf R S X p ≠ \<zero>S
lemma s_cf_deg:
[| p ∈ carrier R; p ≠ \<zero> |] ==> deg_n R S X p = fst (s_cf R S X p)
lemma pol_expr_edeg:
[| p ∈ carrier R; deg R S X p ≤ an d |]
==> ∃f. pol_coeff S f ∧ fst f = d ∧ p = polyn_expr R X d f
lemma cf_scf:
[| pol_coeff S c; k ≤ fst c; polyn_expr R X k c ≠ \<zero> |]
==> ∀j≤fst (s_cf R S X (polyn_expr R X k c)).
snd (s_cf R S X (polyn_expr R X k c)) j = snd c j
lemma scf_d_polTr:
[| p ∈ carrier R; deg R S X p ≤ an d |] ==> scf_cond R S X p d (scf_d R S X p d)
lemma scf_d_pol:
[| p ∈ carrier R; deg R S X p ≤ an d |]
==> pol_coeff S (scf_d R S X p d) ∧
fst (scf_d R S X p d) = d ∧ p = polyn_expr R X d (scf_d R S X p d)
lemma pol_expr_of_X:
X = polyn_expr R X (Suc 0) (ext_cf S (Suc 0) (C0 S))
lemma deg_n_of_X:
deg_n R S X X = Suc 0
lemma pol_X:
cf_sol R S X X c ==> snd c 0 = \<zero>S ∧ snd c (Suc 0) = 1rS
lemma pol_of_deg0:
[| p ∈ carrier R; p ≠ \<zero> |] ==> (deg_n R S X p = 0) = (p ∈ carrier S)
lemma pols_const:
[| p ∈ carrier R; deg R S X p ≤ 0 |] ==> p ∈ carrier S
lemma less_deg_add_nonzero:
[| p ∈ carrier R; p ≠ \<zero>; q ∈ carrier R; q ≠ \<zero>;
deg_n R S X p < deg_n R S X q |]
==> p ± q ≠ \<zero>
lemma polyn_deg_add1:
[| p ∈ carrier R; p ≠ \<zero>; q ∈ carrier R; q ≠ \<zero>;
deg_n R S X p < deg_n R S X q |]
==> deg_n R S X (p ± q) = deg_n R S X q
lemma polyn_deg_add2:
[| p ∈ carrier R; p ≠ \<zero>; q ∈ carrier R; q ≠ \<zero>; p ± q ≠ \<zero>;
deg_n R S X p = deg_n R S X q |]
==> deg_n R S X (p ± q) ≤ deg_n R S X q
lemma polyn_deg_add3:
[| p ∈ carrier R; p ≠ \<zero>; q ∈ carrier R; q ≠ \<zero>; p ± q ≠ \<zero>;
deg_n R S X p ≤ n; deg_n R S X q ≤ n |]
==> deg_n R S X (p ± q) ≤ n
lemma polyn_deg_add4:
[| p ∈ carrier R; q ∈ carrier R; deg R S X p ≤ an n; deg R S X q ≤ an n |]
==> deg R S X (p ± q) ≤ an n
lemma polyn_deg_add5:
[| p ∈ carrier R; q ∈ carrier R; deg R S X p ≤ a; deg R S X q ≤ a |]
==> deg R S X (p ± q) ≤ a
lemma lower_deg_part:
[| p ∈ carrier R; p ≠ \<zero>; 0 < deg_n R S X p |]
==> deg R S X
(polyn_expr R X (deg_n R S X p - Suc 0) (SOME f. cf_sol R S X p f))
< deg R S X p
lemma ldeg_p_mem:
[| p ∈ carrier R; deg R S X p ≤ an (Suc d) |] ==> ldeg_p R S X d p ∈ carrier R
lemma ldeg_p_zero:
p = \<zero> ==> ldeg_p R S X d p = \<zero>
lemma hdeg_p_mem:
[| p ∈ carrier R; deg R S X p ≤ an (Suc d) |]
==> hdeg_p R S X (Suc d) p ∈ carrier R
lemma hdeg_p_zero:
p = \<zero> ==> hdeg_p R S X (Suc d) p = \<zero>
lemma decompos_p:
[| p ∈ carrier R; deg R S X p ≤ an (Suc d) |]
==> p = ldeg_p R S X d p ± hdeg_p R S X (Suc d) p
lemma deg_ldeg_p:
[| p ∈ carrier R; deg R S X p ≤ an (Suc d) |]
==> deg R S X (ldeg_p R S X d p) ≤ an d
lemma deg_minus_eq:
[| p ∈ carrier R; p ≠ \<zero> |] ==> deg_n R S X (-a p) = deg_n R S X p
lemma deg_minus_eq1:
p ∈ carrier R ==> deg R S X (-a p) = deg R S X p
lemma ldeg_p_pOp:
[| p ∈ carrier R; q ∈ carrier R; deg R S X p ≤ an (Suc d);
deg R S X q ≤ an (Suc d) |]
==> ldeg_p R S X d p ± ldeg_p R S X d q = ldeg_p R S X d (p ± q)
lemma hdeg_p_pOp:
[| p ∈ carrier R; q ∈ carrier R; deg R S X p ≤ an (Suc d);
deg R S X q ≤ an (Suc d) |]
==> hdeg_p R S X (Suc d) p ± hdeg_p R S X (Suc d) q =
hdeg_p R S X (Suc d) (p ± q)
lemma ldeg_p_mOp:
[| p ∈ carrier R; deg R S X p ≤ an (Suc d) |]
==> -a ldeg_p R S X d p = ldeg_p R S X d (-a p)
lemma hdeg_p_mOp:
[| p ∈ carrier R; deg R S X p ≤ an (Suc d) |]
==> -a hdeg_p R S X (Suc d) p = hdeg_p R S X (Suc d) (-a p)
lemma deg_mult_pols:
[| Idomain S; p ∈ carrier R; p ≠ \<zero>; q ∈ carrier R; q ≠ \<zero> |]
==> p ·r q ≠ \<zero> ∧ deg_n R S X (p ·r q) = deg_n R S X p + deg_n R S X q
lemma deg_mult_pols1:
[| Idomain S; p ∈ carrier R; q ∈ carrier R |]
==> deg R S X (p ·r q) = deg R S X p + deg R S X q
lemma const_times_polyn:
[| Idomain S; c ∈ carrier S; c ≠ \<zero>S; p ∈ carrier R; p ≠ \<zero> |]
==> c ·r p ≠ \<zero> ∧ deg_n R S X (c ·r p) = deg_n R S X p
lemma p_times_monomial_nonzero:
[| p ∈ carrier R; p ≠ \<zero> |] ==> X^R j ·r p ≠ \<zero>
lemma p_times_monomial_nonzero1:
[| Idomain S; p ∈ carrier R; p ≠ \<zero>; c ∈ carrier S; c ≠ \<zero>S |]
==> c ·r X^R j ·r p ≠ \<zero>
lemma polyn_ring_integral:
Idomain S = Idomain R
lemma deg_to_X_d:
Idomain S ==> deg_n R S X (X^R d) = d
lemma nonzero_deg_pos:
[| p ∈ carrier R; p ≠ \<zero> |] ==> 0 ≤ deg R S X p
lemma deg_minf_pol_0:
p ∈ carrier R ==> (deg R S X p = - ∞) = (p = \<zero>)
lemma pol_nonzero:
p ∈ carrier R ==> (0 ≤ deg R S X p) = (p ≠ \<zero>)
lemma minus_deg_in_aug_minf:
[| p ∈ carrier R; p ≠ \<zero> |] ==> - deg R S X p ∈ Z-∞
lemma deg_of_X:
deg R S X X = 1
lemma pol_deg_0:
[| p ∈ carrier R; p ≠ \<zero> |] ==> (deg R S X p = 0) = (p ∈ carrier S)
lemma deg_of_X2n:
Idomain S ==> deg R S X (X^R n) = an n
lemma add_pols_nonzero:
[| p ∈ carrier R; q ∈ carrier R; deg R S X p ≠ deg R S X q |]
==> p ± q ≠ \<zero>
lemma deg_pols_add1:
[| p ∈ carrier R; q ∈ carrier R; deg R S X p < deg R S X q |]
==> deg R S X (p ± q) = deg R S X q
lemma deg_pols_add2:
[| p ∈ carrier R; q ∈ carrier R; deg R S X p = deg R S X q |]
==> deg R S X (p ± q) ≤ deg R S X q
lemma deg_pols_add3:
[| p ∈ carrier R; q ∈ carrier R; deg R S X p ≤ an n; deg R S X q ≤ an n |]
==> deg R S X (p ± q) ≤ an n
lemma const_times_polyn1:
[| Idomain S; p ∈ carrier R; c ∈ carrier S; c ≠ \<zero>S |]
==> deg R S X (c ·r p) = deg R S X p
lemma cf_h_len:
[| PolynRg A B Y; f ∈ rHom S B; pol_coeff S c |] ==> fst (cf_h f c) = fst c
lemma cf_h_coeff:
[| PolynRg A B Y; f ∈ rHom S B; pol_coeff S c |] ==> pol_coeff B (cf_h f c)
lemma cf_h_cmp:
[| PolynRg A B Y; pol_coeff S (n, f); h ∈ rHom S B; j ≤ n |]
==> snd (cf_h h (n, f)) j = cmp h f j
lemma cf_h_special_cf:
[| PolynRg A B Y; h ∈ rHom S B |]
==> polyn_expr A Y (Suc 0) (cf_h h (ext_cf S (Suc 0) (C0 S))) =
polyn_expr A Y (Suc 0) (ext_cf B (Suc 0) (C0 B))
lemma polyn_Hom_coeff_to_coeff:
[| PolynRg A B Y; f ∈ pHom R S X, A B Y; pol_coeff S c |]
==> pol_coeff B (cf_h f c)
lemma cf_h_len1:
[| PolynRg A B Y; h ∈ rHom S B; f ∈ pHom R S X, A B Y; ∀x∈carrier S. f x = h x;
pol_coeff S c |]
==> fst (cf_h f c) = fst (cf_h h c)
lemma cf_h_len2:
[| PolynRg A B Y; f ∈ pHom R S X, A B Y; pol_coeff S c |]
==> fst (cf_h f c) = fst c
lemma cmp_pol_coeff:
[| f ∈ rHom S B; pol_coeff S (n, c) |] ==> pol_coeff B (n, cmp f c)
lemma cmp_pol_coeff_e:
[| PolynRg A B Y; f ∈ pHom R S X, A B Y; pol_coeff S (n, c) |]
==> pol_coeff B (n, cmp f c)
lemma cf_h_pol_coeff:
[| PolynRg A B Y; h ∈ rHom S B; pol_coeff S (n, f) |]
==> cf_h h (n, f) = (n, cmp h f)
lemma cf_h_polyn:
[| PolynRg A B Y; h ∈ rHom S B; pol_coeff S (n, f) |]
==> polyn_expr A Y n (cf_h h (n, f)) = polyn_expr A Y n (n, cmp h f)
lemma pHom_rHom:
[| PolynRg A B Y; f ∈ pHom R S X, A B Y |] ==> f ∈ rHom R A
lemma pHom_X_Y:
[| PolynRg A B Y; f ∈ pHom R S X, A B Y |] ==> f X = Y
lemma pHom_memTr:
[| PolynRg A B Y; f ∈ pHom R S X, A B Y |]
==> ∀c. pol_coeff S (n, c) -->
f (polyn_expr R X n (n, c)) = polyn_expr A Y n (n, cmp f c)
lemma pHom_mem:
[| PolynRg A B Y; f ∈ pHom R S X, A B Y; pol_coeff S (n, c) |]
==> f (polyn_expr R X n (n, c)) = polyn_expr A Y n (n, cmp f c)
lemma pHom_memc:
[| PolynRg A B Y; f ∈ pHom R S X, A B Y; pol_coeff S c |]
==> f (polyn_expr R X (fst c) c) = polyn_expr A Y (fst c) (cf_h f c)
lemma pHom_mem1:
[| PolynRg A B Y; f ∈ pHom R S X, A B Y; p ∈ carrier R |] ==> f p ∈ carrier A
lemma pHom_pol_mem:
[| PolynRg A B Y; f ∈ pHom R S X, A B Y; p ∈ carrier R; p ≠ \<zero> |]
==> f p = polyn_expr A Y (deg_n R S X p) (cf_h f (s_cf R S X p))
lemma erh_rHom_coeff:
[| PolynRg A B Y; h ∈ rHom S B; pol_coeff S c |]
==> erh R S X A B Y h 0 c = cmp h (snd c) 0
lemma erh_polyn_exprs:
[| PolynRg A B Y; h ∈ rHom S B; pol_coeff S c; pol_coeff S d;
polyn_expr R X (fst c) c = polyn_expr R X (fst d) d |]
==> erh R S X A B Y h (fst c) c = erh R S X A B Y h (fst d) d
lemma erH_rHom_0:
[| PolynRg A B Y; h ∈ rHom S B |] ==> erH R S X A B Y h \<zero> = \<zero>A
lemma erH_mem:
[| PolynRg A B Y; h ∈ rHom S B; p ∈ carrier R |]
==> erH R S X A B Y h p ∈ carrier A
lemma erH_rHom_nonzero:
[| PolynRg A B Y; f ∈ rHom S B; p ∈ carrier R; erH R S X A B Y f p ≠ \<zero>A |]
==> p ≠ \<zero>
lemma erH_rHomTr2:
[| PolynRg A B Y; h ∈ rHom S B |] ==> erH R S X A B Y h 1r = 1rA
lemma erH_multTr:
[| PolynRg A B Y; h ∈ rHom S B; pol_coeff S c |]
==> ∀f g. pol_coeff S (m, f) ∧
pol_coeff S (fst c + m, g) ∧
polyn_expr R X (fst c) c ·r polyn_expr R X m (m, f) =
polyn_expr R X (fst c + m) (fst c + m, g) -->
polyn_expr A Y (fst c) (cf_h h c) ·rA
polyn_expr A Y m (cf_h h (m, f)) =
polyn_expr A Y (fst c + m) (cf_h h (fst c + m, g))
lemma erH_multTr1:
[| PolynRg A B Y; h ∈ rHom S B; pol_coeff S c; pol_coeff S d; pol_coeff S e;
fst e = fst c + fst d;
polyn_expr R X (fst c) c ·r polyn_expr R X (fst d) d =
polyn_expr R X (fst c + fst d) e |]
==> polyn_expr A Y (fst c) (cf_h h c) ·rA polyn_expr A Y (fst d) (cf_h h d) =
polyn_expr A Y (fst e) (cf_h h e)
lemma erHomTr0:
[| PolynRg A B Y; h ∈ rHom S B; x ∈ carrier R |]
==> erH R S X A B Y h (-a x) = -aA erH R S X A B Y h x
lemma erHomTr1:
[| PolynRg A B Y; h ∈ rHom S B; a ∈ carrier R; b ∈ carrier R; a ≠ \<zero>;
b ≠ \<zero>; a ± b ≠ \<zero>; deg_n R S X a = deg_n R S X b |]
==> erH R S X A B Y h (a ± b) = erH R S X A B Y h a ±A erH R S X A B Y h b
lemma erHomTr2:
[| PolynRg A B Y; h ∈ rHom S B; a ∈ carrier R; b ∈ carrier R; a ≠ \<zero>;
b ≠ \<zero>; a ± b ≠ \<zero>; deg_n R S X a < deg_n R S X b |]
==> erH R S X A B Y h (a ± b) = erH R S X A B Y h a ±A erH R S X A B Y h b
lemma erH_rHom:
[| Idomain S; PolynRg A B Y; h ∈ rHom S B |]
==> erH R S X A B Y h ∈ pHom R S X, A B Y
lemma erH_q_rHom:
[| Idomain S; maximal_ideal S P; PolynRg R' (S /r P) Y |]
==> erH R S X R' (S /r P) Y (pj S P) ∈ pHom R S X, R' S /r P Y
lemma erH_add:
[| Idomain S; PolynRg A B Y; h ∈ rHom S B; p ∈ carrier R; q ∈ carrier R |]
==> erH R S X A B Y h (p ± q) = erH R S X A B Y h p ±A erH R S X A B Y h q
lemma erH_minus:
[| Idomain S; PolynRg A B Y; h ∈ rHom S B; p ∈ carrier R |]
==> erH R S X A B Y h (-a p) = -aA erH R S X A B Y h p
lemma erH_mult:
[| Idomain S; PolynRg A B Y; h ∈ rHom S B; p ∈ carrier R; q ∈ carrier R |]
==> erH R S X A B Y h (p ·r q) = erH R S X A B Y h p ·rA erH R S X A B Y h q
lemma erH_rHom_cf:
[| Idomain S; PolynRg A B Y; h ∈ rHom S B; s ∈ carrier S |]
==> erH R S X A B Y h s = h s
lemma erH_rHom_coeff:
[| Idomain S; PolynRg A B Y; h ∈ rHom S B; pol_coeff S (n, f) |]
==> pol_coeff B (n, cmp h f)
lemma erH_rHom_unique:
[| Idomain S; PolynRg A B Y; h ∈ rHom S B |]
==> ∃!g. g ∈ pHom R S X, A B Y ∧ (∀x∈carrier S. h x = g x)
lemma erH_rHom_unique1:
[| Idomain S; PolynRg A B Y; h ∈ rHom S B; f ∈ pHom R S X, A B Y;
∀x∈carrier S. f x = h x |]
==> f = erH R S X A B Y h
lemma pHom_dec_deg:
[| PolynRg A B Y; f ∈ pHom R S X, A B Y; p ∈ carrier R |]
==> deg A B Y (f p) ≤ deg R S X p
lemma erH_map:
[| Idomain S; PolynRg A B Y; h ∈ rHom S B; pol_coeff S (n, c) |]
==> erH R S X A B Y h (polyn_expr R X n (n, c)) = polyn_expr A Y n (n, cmp h c)
lemma divisionTr0:
[| Idomain S; p ∈ carrier R; c ∈ carrier S; c ≠ \<zero>S |]
==> lcf R S X (c ·r X^R n ·r p) = c ·rS lcf R S X p
lemma divisionTr1:
[| Corps S; g ∈ carrier R; g ≠ \<zero>; 0 < deg_n R S X g; f ∈ carrier R;
f ≠ \<zero>; deg_n R S X g ≤ deg_n R S X f |]
==> f ± -a lcf R S X f ·rS lcf R S X g S ·r
X^R (deg_n R S X f - deg_n R S X g) ·r
g =
\<zero> ∨
deg_n R S X
(f ± -a lcf R S X f ·rS lcf R S X g S ·r
X^R (deg_n R S X f - deg_n R S X g) ·r
g)
< deg_n R S X f
lemma divisionTr2:
[| Corps S; g ∈ carrier R; g ≠ \<zero>; 0 < deg_n R S X g |]
==> ∀f. div_condn R S X n g f
lemma divisionTr3:
[| Corps S; g ∈ carrier R; g ≠ \<zero>; 0 < deg_n R S X g; f ∈ carrier R |]
==> ∃q∈carrier R.
f ± -a q ·r g = \<zero> ∨
f ± -a q ·r g ≠ \<zero> ∧ deg_n R S X (f ± -a q ·r g) < deg_n R S X g
lemma divisionTr4:
[| Corps S; g ∈ carrier R; g ≠ \<zero>; 0 < deg_n R S X g; f ∈ carrier R |]
==> ∃q∈carrier R.
f = q ·r g ∨
(∃r∈carrier R.
r ≠ \<zero> ∧ f = q ·r g ± r ∧ deg_n R S X r < deg_n R S X g)
lemma divisionTr:
[| Corps S; g ∈ carrier R; 0 < deg R S X g; f ∈ carrier R |]
==> ∃q∈carrier R. ∃r∈carrier R. f = q ·r g ± r ∧ deg R S X r < deg R S X g
lemma rel_prime_equation:
[| Corps S; f ∈ carrier R; g ∈ carrier R; 0 < deg R S X f; 0 < deg R S X g;
rel_prime_pols R S X f g; h ∈ carrier R |]
==> ∃u∈carrier R.
∃v∈carrier R.
deg R S X u ≤ amax (deg R S X h - deg R S X f) (deg R S X g) ∧
deg R S X v ≤ deg R S X f ∧ u ·r f ± v ·r g = h
lemma P_mod_whole:
p ∈ carrier R ==> P_mod R S X (carrier S) p
lemma zero_P_mod:
ideal S I ==> P_mod R S X I \<zero>
lemma P_mod_mod:
[| ideal S I; p ∈ carrier R; pol_coeff S c; p = polyn_expr R X (fst c) c |]
==> (∀j≤fst c. snd c j ∈ I) = P_mod R S X I p
lemma monomial_P_mod_mod:
[| ideal S I; c ∈ carrier S; p = c ·r X^R d |] ==> (c ∈ I) = P_mod R S X I p
lemma P_mod_add:
[| ideal S I; p ∈ carrier R; q ∈ carrier R; P_mod R S X I p; P_mod R S X I q |]
==> P_mod R S X I (p ± q)
lemma P_mod_minus:
[| ideal S I; p ∈ carrier R; P_mod R S X I p |] ==> P_mod R S X I (-a p)
lemma P_mod_pre:
[| ideal S I; pol_coeff S (Suc n, f);
P_mod R S X I (polyn_expr R X (Suc n) (Suc n, f)) |]
==> P_mod R S X I (polyn_expr R X n (n, f))
lemma P_mod_pre1:
[| ideal S I; pol_coeff S (Suc n, f);
P_mod R S X I (polyn_expr R X (Suc n) (Suc n, f)) |]
==> P_mod R S X I (polyn_expr R X n (Suc n, f))
lemma P_mod_coeffTr:
[| ideal S I; d ∈ carrier S |] ==> P_mod R S X I d = (d ∈ I)
lemma P_mod_mult_const:
[| ideal S I; ideal S J; pol_coeff S (n, f);
P_mod R S X I (polyn_expr R X n (n, f)); pol_coeff S (0, g);
P_mod R S X J (polyn_expr R X 0 (0, g)) |]
==> P_mod R S X (I ♦rS J) (polyn_expr R X n (n, f) ·r polyn_expr R X 0 (0, g))
lemma P_mod_mult_const1:
[| ideal S I; ideal S J; pol_coeff S (n, f);
P_mod R S X I (polyn_expr R X n (n, f)); d ∈ J |]
==> P_mod R S X (I ♦rS J) (polyn_expr R X n (n, f) ·r d)
lemma P_mod_mult_monomial:
[| ideal S I; p ∈ carrier R |] ==> P_mod R S X I p = P_mod R S X I (p ·r X^R m)
lemma P_mod_multTr:
[| ideal S I; ideal S J; pol_coeff S (n, f);
P_mod R S X I (polyn_expr R X n (n, f)) |]
==> ∀g. pol_coeff S (m, g) ∧ P_mod R S X J (polyn_expr R X m (m, g)) -->
P_mod R S X (I ♦rS J)
(polyn_expr R X n (n, f) ·r polyn_expr R X m (m, g))
lemma P_mod_mult:
[| ideal S I; ideal S J; pol_coeff S (n, c); pol_coeff S (m, d);
P_mod R S X I (polyn_expr R X n (n, c));
P_mod R S X J (polyn_expr R X m (m, d)) |]
==> P_mod R S X (I ♦rS J) (polyn_expr R X n (n, c) ·r polyn_expr R X m (m, d))
lemma P_mod_mult1:
[| ideal S I; ideal S J; p ∈ carrier R; q ∈ carrier R; P_mod R S X I p;
P_mod R S X J q |]
==> P_mod R S X (I ♦rS J) (p ·r q)
lemma P_mod_mult2l:
[| ideal S I; p ∈ carrier R; q ∈ carrier R; P_mod R S X I p |]
==> P_mod R S X I (p ·r q)
lemma P_mod_mult2r:
[| ideal S I; p ∈ carrier R; q ∈ carrier R; P_mod R S X I q |]
==> P_mod R S X I (p ·r q)
lemma csrp_fn_pol_coeff:
[| ideal S P; PolynRg R' (S /r P) Y; pol_coeff (S /r P) (n, c') |]
==> pol_coeff S (n, cmp (csrp_fn S P) c')
lemma pj_csrp_mem_coeff:
[| ideal S P; pol_coeff (S /r P) (n, c') |]
==> ∀j≤n. pj S P (csrp_fn S P (c' j)) = c' j
lemma pHom_pj_csrp:
[| Idomain S; ideal S P; PolynRg R' (S /r P) Y; pol_coeff (S /r P) (n, c') |]
==> erH R S X R' (S /r P) Y (pj S P)
(polyn_expr R X n (n, cmp (csrp_fn S P) c')) =
polyn_expr R' Y n (n, c')
lemma ext_csrp_fn_nonzero:
[| Idomain S; ideal S P; PolynRg R' (S /r P) Y; g' ∈ carrier R';
g' ≠ \<zero>R' |]
==> polyn_expr R X (deg_n R' (S /r P) Y g')
(deg_n R' (S /r P) Y g', cmp (csrp_fn S P) (snd (s_cf R' (S /r P) Y g'))) ≠
\<zero>
lemma erH_inv:
[| Idomain S; ideal S P; Ring R'; PolynRg R' (S /r P) Y; g' ∈ carrier R' |]
==> ∃g∈carrier R.
deg R S X g ≤ deg R' (S /r P) Y g' ∧
erH R S X R' (S /r P) Y (pj S P) g = g'
lemma P_mod_0:
[| Idomain S; ideal S P; PolynRg R' (S /r P) Y; g ∈ carrier R |]
==> (erH R S X R' (S /r P) Y (pj S P) g = \<zero>R') = P_mod R S X P g
lemma P_mod_I_J:
[| p ∈ carrier R; ideal S I; ideal S J; I ⊆ J; P_mod R S X I p |]
==> P_mod R S X J p
lemma P_mod_n_1:
[| Idomain S; t ∈ carrier S; g ∈ carrier R; P_mod R S X (S ♦p (t^S Suc n)) g |]
==> P_mod R S X (S ♦p t) g
lemma P_mod_n_m:
[| Idomain S; t ∈ carrier S; g ∈ carrier R; m ≤ n;
P_mod R S X (S ♦p (t^S Suc n)) g |]
==> P_mod R S X (S ♦p (t^S Suc m)) g
lemma P_mod_diff:
[| Idomain S; ideal S P; PolynRg R' (S /r P) Y; g ∈ carrier R; h ∈ carrier R |]
==> (erH R S X R' (S /r P) Y (pj S P) g = erH R S X R' (S /r P) Y (pj S P) h) =
P_mod R S X P (g ± -a h)
lemma P_mod_erH:
[| Idomain S; ideal S P; PolynRg R' (S /r P) Y; g ∈ carrier R; v ∈ carrier R;
t ∈ P |]
==> erH R S X R' (S /r P) Y (pj S P) g =
erH R S X R' (S /r P) Y (pj S P) (g ± t ·r v)
lemma coeff_principalTr:
t ∈ carrier S
==> ∀f. pol_coeff S (n, f) ∧ (∀j≤n. f j ∈ S ♦p t) -->
(∃f'. pol_coeff S (n, f') ∧ (∀j≤n. f j = t ·rS f' j))
lemma coeff_principal:
[| t ∈ carrier S; pol_coeff S (n, f); ∀j≤n. f j ∈ S ♦p t |]
==> ∃f'. pol_coeff S (n, f') ∧ (∀j≤n. f j = t ·rS f' j)
lemma Pmod_0_principal:
[| Idomain S; t ∈ carrier S; g ∈ carrier R; P_mod R S X (S ♦p t) g |]
==> ∃h∈carrier R. g = t ·r h
lemma Pmod0_principal_rev:
[| Idomain S; t ∈ carrier S; g ∈ carrier R; ∃h∈carrier R. g = t ·r h |]
==> P_mod R S X (S ♦p t) g
lemma Pmod0_principal_rev1:
[| Idomain S; t ∈ carrier S; h ∈ carrier R |] ==> P_mod R S X (S ♦p t) (t ·r h)
lemma Pmod0_principal_erH_vanish_t:
[| Idomain S; ideal S (S ♦p t); t ∈ carrier S; t ≠ \<zero>S;
PolynRg R' (S /r (S ♦p t)) Y |]
==> erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) t = \<zero>R'
lemma P_mod_diffxxx1:
[| Idomain S; t ∈ carrier S; t ≠ \<zero>S; maximal_ideal S (S ♦p t);
PolynRg R' (S /r (S ♦p t)) Y; f ∈ carrier R; g ∈ carrier R; h ∈ carrier R;
f ≠ \<zero>; g ≠ \<zero>; h ≠ \<zero>; u ∈ carrier R; v ∈ carrier R;
erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g ≠ \<zero>R';
erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h ≠ \<zero>R'; ra ∈ carrier R;
f ± -a g ·r h = t^S m ·r ra; 0 < m;
erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) u ·rR'
erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g ±R'
erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) v ·rR'
erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h =
erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) ra |]
==> P_mod R S X (S ♦p (t^S Suc m)) (f ± -a (g ± t^S m ·r v) ·r (h ± t^S m ·r u))
lemma P_mod_diffxxx2:
[| Idomain S; t ∈ carrier S; t ≠ \<zero>S; maximal_ideal S (S ♦p t);
PolynRg R' (S /r (S ♦p t)) Y; f ∈ carrier R; g ∈ carrier R; h ∈ carrier R;
deg R S X g
≤ deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g);
deg R S X h +
deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)
≤ deg R S X f;
0 < deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g);
0 < deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h);
rel_prime_pols R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h);
P_mod R S X (S ♦p (t^S m)) (f ± -a g ·r h); 0 < m |]
==> ∃g1 h1.
g1 ∈ carrier R ∧
h1 ∈ carrier R ∧
deg R S X g1
≤ deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g1) ∧
P_mod R S X (S ♦p (t^S m)) (g ± -a g1) ∧
deg R S X h1 +
deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g1)
≤ deg R S X f ∧
P_mod R S X (S ♦p (t^S m)) (h ± -a h1) ∧
P_mod R S X (S ♦p (t^S Suc m)) (f ± -a g1 ·r h1)
lemma cart_prod_fst:
x ∈ A × B ==> fst x ∈ A
lemma cart_prod_snd:
x ∈ A × B ==> snd x ∈ B
lemma cart_prod_split:
((x, y) ∈ A × B) = (x ∈ A ∧ y ∈ B)
lemma P_mod_diffxxx3:
[| Idomain S; t ∈ carrier S; t ≠ \<zero>S; maximal_ideal S (S ♦p t);
PolynRg R' (S /r (S ♦p t)) Y; f ∈ carrier R; gh ∈ carrier R × carrier R;
deg R S X (fst gh)
≤ deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh));
deg R S X (snd gh) +
deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh))
≤ deg R S X f;
0 < deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh));
0 < deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd gh));
rel_prime_pols R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh))
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd gh));
P_mod R S X (S ♦p (t^S m)) (f ± -a fst gh ·r snd gh); 0 < m |]
==> ∃gh1. gh1 ∈ carrier R × carrier R ∧
deg R S X (fst gh1)
≤ deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh1)) ∧
P_mod R S X (S ♦p (t^S m)) (fst gh ± -a fst gh1) ∧
deg R S X (snd gh1) +
deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh1))
≤ deg R S X f ∧
P_mod R S X (S ♦p (t^S m)) (snd gh ± -a snd gh1) ∧
P_mod R S X (S ♦p (t^S Suc m)) (f ± -a fst gh1 ·r snd gh1)
lemma P_mod_diffxxx4:
[| Idomain S; t ∈ carrier S; t ≠ \<zero>S; maximal_ideal S (S ♦p t);
PolynRg R' (S /r (S ♦p t)) Y; f ∈ carrier R; gh ∈ carrier R × carrier R;
deg R S X (fst gh)
≤ deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh));
deg R S X (snd gh) +
deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh))
≤ deg R S X f;
0 < deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh));
0 < deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd gh));
rel_prime_pols R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst gh))
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd gh));
P_mod R S X (S ♦p (t^S m)) (f ± -a fst gh ·r snd gh); 0 < m |]
==> Hen R S X t R' Y f m gh ∈ carrier R × carrier R ∧
deg R S X (fst (Hen R S X t R' Y f m gh))
≤ deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t))
(fst (Hen R S X t R' Y f m gh))) ∧
P_mod R S X (S ♦p (t^S m)) (fst gh ± -a fst (Hen R S X t R' Y f m gh)) ∧
deg R S X (snd (Hen R S X t R' Y f m gh)) +
deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t))
(fst (Hen R S X t R' Y f m gh)))
≤ deg R S X f ∧
P_mod R S X (S ♦p (t^S m)) (snd gh ± -a snd (Hen R S X t R' Y f m gh)) ∧
P_mod R S X (S ♦p (t^S Suc m))
(f ± -a fst (Hen R S X t R' Y f m gh) ·r snd (Hen R S X t R' Y f m gh))
lemma fst_xxx:
[| t ∈ carrier S; t ≠ \<zero>S; ideal S (S ♦p t);
∀n. F n ∈ carrier R × carrier R;
∀m. P_mod R S X (S ♦p t) (fst (F m) ± -a fst (F (Suc m))) |]
==> P_mod R S X (S ♦p t) (fst (F 0) ± -a fst (F n))
lemma snd_xxx:
[| t ∈ carrier S; t ≠ \<zero>S; ideal S (S ♦p t);
∀n. F n ∈ carrier R × carrier R;
∀m. P_mod R S X (S ♦p t) (snd (F m) ± -a snd (F (Suc m))) |]
==> P_mod R S X (S ♦p t) (snd (F 0) ± -a snd (F n))
lemma P_mod_diffxxx5:
[| Idomain S; t ∈ carrier S; t ≠ \<zero>S; maximal_ideal S (S ♦p t);
PolynRg R' (S /r (S ♦p t)) Y; f ∈ carrier R; (g, h) ∈ carrier R × carrier R;
deg R S X (fst (g, h))
≤ deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (g, h)));
deg R S X (snd (g, h)) +
deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (g, h)))
≤ deg R S X f;
0 < deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (g, h)));
0 < deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd (g, h)));
rel_prime_pols R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (g, h)))
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd (g, h)));
P_mod R S X (S ♦p t) (f ± -a g ·r h) |]
==> Hpr R S X t R' Y f g h Suc m ∈ carrier R × carrier R ∧
erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t))
(fst (Hpr R S X t R' Y f g h Suc m)) =
erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (g, h)) ∧
erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t))
(snd (Hpr R S X t R' Y f g h Suc m)) =
erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd (g, h)) ∧
deg R S X (fst (Hpr R S X t R' Y f g h Suc m))
≤ deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t))
(fst (Hpr R S X t R' Y f g h Suc m))) ∧
P_mod R S X (S ♦p (t^S Suc m))
(fst (Hpr R S X t R' Y f g h m) ± -a fst (Hpr R S X t R' Y f g h Suc m)) ∧
deg R S X (snd (Hpr R S X t R' Y f g h Suc m)) +
deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t))
(fst (Hpr R S X t R' Y f g h Suc m)))
≤ deg R S X f ∧
P_mod R S X (S ♦p (t^S Suc m))
(snd (Hpr R S X t R' Y f g h m) ± -a snd (Hpr R S X t R' Y f g h Suc m)) ∧
P_mod R S X (S ♦p (t^S Suc (Suc m)))
(f ± -a fst (Hpr R S X t R' Y f g h Suc m) ·r
snd (Hpr R S X t R' Y f g h Suc m))
lemma P_mod_diffxxx5_1:
[| Idomain S; t ∈ carrier S; t ≠ \<zero>S; maximal_ideal S (S ♦p t);
PolynRg R' (S /r (S ♦p t)) Y; f ∈ carrier R; g ∈ carrier R; h ∈ carrier R;
deg R S X g
≤ deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g);
deg R S X h +
deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)
≤ deg R S X f;
0 < deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g);
0 < deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h);
rel_prime_pols R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h);
P_mod R S X (S ♦p t) (f ± -a g ·r h) |]
==> Hpr R S X t R' Y f g h Suc m ∈ carrier R × carrier R ∧
erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t))
(fst (Hpr R S X t R' Y f g h Suc m)) =
erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (fst (g, h)) ∧
erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t))
(snd (Hpr R S X t R' Y f g h Suc m)) =
erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) (snd (g, h)) ∧
deg R S X (fst (Hpr R S X t R' Y f g h Suc m))
≤ deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t))
(fst (Hpr R S X t R' Y f g h Suc m))) ∧
P_mod R S X (S ♦p (t^S Suc m))
(fst (Hpr R S X t R' Y f g h m) ± -a fst (Hpr R S X t R' Y f g h Suc m)) ∧
deg R S X (snd (Hpr R S X t R' Y f g h Suc m)) +
deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t))
(fst (Hpr R S X t R' Y f g h Suc m)))
≤ deg R S X f ∧
P_mod R S X (S ♦p (t^S Suc m))
(snd (Hpr R S X t R' Y f g h m) ± -a snd (Hpr R S X t R' Y f g h Suc m)) ∧
P_mod R S X (S ♦p (t^S Suc (Suc m)))
(f ± -a fst (Hpr R S X t R' Y f g h Suc m) ·r
snd (Hpr R S X t R' Y f g h Suc m))
lemma P_mod_diffxxx5_2:
[| Idomain S; t ∈ carrier S; t ≠ \<zero>S; maximal_ideal S (S ♦p t);
PolynRg R' (S /r (S ♦p t)) Y; f ∈ carrier R; g ∈ carrier R; h ∈ carrier R;
deg R S X g
≤ deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g);
deg R S X h +
deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)
≤ deg R S X f;
0 < deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g);
0 < deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h);
rel_prime_pols R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h);
P_mod R S X (S ♦p t) (f ± -a g ·r h) |]
==> Hpr R S X t R' Y f g h m ∈ carrier R × carrier R
lemma P_mod_diffxxx5_3:
[| Idomain S; t ∈ carrier S; t ≠ \<zero>S; maximal_ideal S (S ♦p t);
PolynRg R' (S /r (S ♦p t)) Y; f ∈ carrier R; g ∈ carrier R; h ∈ carrier R;
deg R S X g
≤ deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g);
deg R S X h +
deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)
≤ deg R S X f;
0 < deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g);
0 < deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h);
rel_prime_pols R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h);
P_mod R S X (S ♦p t) (f ± -a g ·r h) |]
==> P_mod R S X (S ♦p (t^S m))
(fst (Hpr R S X t R' Y f g h m) ±
-a fst (Hpr R S X t R' Y f g h (m + n))) ∧
P_mod R S X (S ♦p (t^S m))
(snd (Hpr R S X t R' Y f g h m) ± -a snd (Hpr R S X t R' Y f g h (m + n)))
lemma P_mod_diffxxx5_4:
[| Idomain S; t ∈ carrier S; t ≠ \<zero>S; maximal_ideal S (S ♦p t);
PolynRg R' (S /r (S ♦p t)) Y; f ∈ carrier R; g ∈ carrier R; h ∈ carrier R;
deg R S X g
≤ deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g);
deg R S X h +
deg R' (S /r (S ♦p t)) Y (erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)
≤ deg R S X f;
0 < deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g);
0 < deg R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h);
rel_prime_pols R' (S /r (S ♦p t)) Y
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) g)
(erH R S X R' (S /r (S ♦p t)) Y (pj S (S ♦p t)) h);
P_mod R S X (S ♦p t) (f ± -a g ·r h) |]
==> deg R S X (fst (Hpr R S X t R' Y f g h m)) ≤ deg R S X g ∧
deg R S X (snd (Hpr R S X t R' Y f g h m)) ≤ deg R S X f