[STATEMENT]
lemma gcd_impl_start_code:
  "gcd_impl_start G1 G2 =
     (let pmod = pseudo_mod G1 G2
         in if pmod = 0 then G2
            else let
                 n2 = degree G2;
                 n1 = degree G1;
                 d1 = n1 - n2;
                 G3 = if even d1 then - pmod else pmod;
                 pmod = pseudo_mod G2 G3
                 in if pmod = 0
                    then G3
                    else let
                           g2 = lead_coeff G2;
                           n3 = degree G3;
                           h2 = (if d1 = 1 then g2 else g2 ^ d1);
                           d2 = n2 - n3;
                           divisor = (if d2 = 1 then g2 * h2 else if even d2 then - g2 * h2 ^ d2 else g2 * h2 ^ d2);
                           G4 = sdiv_poly pmod divisor
                         in gcd_impl_rec G3 G4 n3 d2 h2)"
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. gcd_impl_start G1 G2 = (let pmod = pseudo_mod G1 G2 in if pmod = 0 then G2 else let n2 = degree G2; n1 = degree G1; d1 = n1 - n2; G3 = if even d1 then - pmod else pmod; pmod = pseudo_mod G2 G3 in if pmod = 0 then G3 else let g2 = lead_coeff G2; n3 = degree G3; h2 = if d1 = 1 then g2 else g2 ^ d1; d2 = n2 - n3; divisor = if d2 = 1 then g2 * h2 else if even d2 then - g2 * h2 ^ d2 else g2 * h2 ^ d2; G4 = sdiv_poly pmod divisor in gcd_impl_rec G3 G4 n3 d2 h2)
[PROOF STEP]
proof -
[PROOF STATE]
proof (state)
goal (1 subgoal):
 1. gcd_impl_start G1 G2 = (let pmod = pseudo_mod G1 G2 in if pmod = 0 then G2 else let n2 = degree G2; n1 = degree G1; d1 = n1 - n2; G3 = if even d1 then - pmod else pmod; pmod = pseudo_mod G2 G3 in if pmod = 0 then G3 else let g2 = lead_coeff G2; n3 = degree G3; h2 = if d1 = 1 then g2 else g2 ^ d1; d2 = n2 - n3; divisor = if d2 = 1 then g2 * h2 else if even d2 then - g2 * h2 ^ d2 else g2 * h2 ^ d2; G4 = sdiv_poly pmod divisor in gcd_impl_rec G3 G4 n3 d2 h2)
[PROOF STEP]
obtain d1 where d1: "degree G1 - degree G2 = d1"
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. (\<And>d1. degree G1 - degree G2 = d1 \<Longrightarrow> thesis) \<Longrightarrow> thesis
[PROOF STEP]
by auto
[PROOF STATE]
proof (state)
this:
degree G1 - degree G2 = d1

goal (1 subgoal):
 1. gcd_impl_start G1 G2 = (let pmod = pseudo_mod G1 G2 in if pmod = 0 then G2 else let n2 = degree G2; n1 = degree G1; d1 = n1 - n2; G3 = if even d1 then - pmod else pmod; pmod = pseudo_mod G2 G3 in if pmod = 0 then G3 else let g2 = lead_coeff G2; n3 = degree G3; h2 = if d1 = 1 then g2 else g2 ^ d1; d2 = n2 - n3; divisor = if d2 = 1 then g2 * h2 else if even d2 then - g2 * h2 ^ d2 else g2 * h2 ^ d2; G4 = sdiv_poly pmod divisor in gcd_impl_rec G3 G4 n3 d2 h2)
[PROOF STEP]
have id1: "(if even d1 then - pmod else pmod) = (-1)^ (d1 + 1) * (pmod :: 'a poly)" for pmod
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. (if even d1 then - pmod else pmod) = (- 1) ^ (d1 + 1) * pmod
[PROOF STEP]
by simp
[PROOF STATE]
proof (state)
this:
(if even d1 then - ?pmod2 else ?pmod2) = (- 1) ^ (d1 + 1) * ?pmod2

goal (1 subgoal):
 1. gcd_impl_start G1 G2 = (let pmod = pseudo_mod G1 G2 in if pmod = 0 then G2 else let n2 = degree G2; n1 = degree G1; d1 = n1 - n2; G3 = if even d1 then - pmod else pmod; pmod = pseudo_mod G2 G3 in if pmod = 0 then G3 else let g2 = lead_coeff G2; n3 = degree G3; h2 = if d1 = 1 then g2 else g2 ^ d1; d2 = n2 - n3; divisor = if d2 = 1 then g2 * h2 else if even d2 then - g2 * h2 ^ d2 else g2 * h2 ^ d2; G4 = sdiv_poly pmod divisor in gcd_impl_rec G3 G4 n3 d2 h2)
[PROOF STEP]
show ?thesis
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. gcd_impl_start G1 G2 = (let pmod = pseudo_mod G1 G2 in if pmod = 0 then G2 else let n2 = degree G2; n1 = degree G1; d1 = n1 - n2; G3 = if even d1 then - pmod else pmod; pmod = pseudo_mod G2 G3 in if pmod = 0 then G3 else let g2 = lead_coeff G2; n3 = degree G3; h2 = if d1 = 1 then g2 else g2 ^ d1; d2 = n2 - n3; divisor = if d2 = 1 then g2 * h2 else if even d2 then - g2 * h2 ^ d2 else g2 * h2 ^ d2; G4 = sdiv_poly pmod divisor in gcd_impl_rec G3 G4 n3 d2 h2)
[PROOF STEP]
unfolding gcd_impl_start_def subresultant_prs_impl_def gcd_impl_rec_def[symmetric] Let_def split
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. (if pseudo_mod G1 G2 = 0 then fst (G2, lead_coeff G2 ^ (degree G1 - degree G2)) else if pseudo_mod G2 ((- 1) ^ (degree G1 - degree G2 + 1) * pseudo_mod G1 G2) = 0 then fst ((- 1) ^ (degree G1 - degree G2 + 1) * pseudo_mod G1 G2, if degree G2 - degree ((- 1) ^ (degree G1 - degree G2 + 1) * pseudo_mod G1 G2) = 1 then lead_coeff ((- 1) ^ (degree G1 - degree G2 + 1) * pseudo_mod G1 G2) else div_exp (lead_coeff ((- 1) ^ (degree G1 - degree G2 + 1) * pseudo_mod G1 G2)) (lead_coeff G2 ^ (degree G1 - degree G2)) (degree G2 - degree ((- 1) ^ (degree G1 - degree G2 + 1) * pseudo_mod G1 G2))) else gcd_impl_rec ((- 1) ^ (degree G1 - degree G2 + 1) * pseudo_mod G1 G2) (sdiv_poly (pseudo_mod G2 ((- 1) ^ (degree G1 - degree G2 + 1) * pseudo_mod G1 G2)) ((- (1::'a)) ^ (degree G2 - degree ((- 1) ^ (degree G1 - degree G2 + 1) * pseudo_mod G1 G2) + 1) * lead_coeff G2 * (lead_coeff G2 ^ (degree G1 - degree G2)) ^ (degree G2 - degree ((- 1) ^ (degree G1 - degree G2 + 1) * pseudo_mod G1 G2)))) (degree ((- 1) ^ (degree G1 - degree G2 + 1) * pseudo_mod G1 G2)) (degree G2 - degree ((- 1) ^ (degree G1 - degree G2 + 1) * pseudo_mod G1 G2)) (lead_coeff G2 ^ (degree G1 - degree G2))) = (if pseudo_mod G1 G2 = 0 then G2 else if pseudo_mod G2 (if even (degree G1 - degree G2) then - pseudo_mod G1 G2 else pseudo_mod G1 G2) = 0 then if even (degree G1 - degree G2) then - pseudo_mod G1 G2 else pseudo_mod G1 G2 else gcd_impl_rec (if even (degree G1 - degree G2) then - pseudo_mod G1 G2 else pseudo_mod G1 G2) (sdiv_poly (pseudo_mod G2 (if even (degree G1 - degree G2) then - pseudo_mod G1 G2 else pseudo_mod G1 G2)) (if degree G2 - degree (if even (degree G1 - degree G2) then - pseudo_mod G1 G2 else pseudo_mod G1 G2) = 1 then lead_coeff G2 * (if degree G1 - degree G2 = 1 then lead_coeff G2 else lead_coeff G2 ^ (degree G1 - degree G2)) else if even (degree G2 - degree (if even (degree G1 - degree G2) then - pseudo_mod G1 G2 else pseudo_mod G1 G2)) then - lead_coeff G2 * (if degree G1 - degree G2 = 1 then lead_coeff G2 else lead_coeff G2 ^ (degree G1 - degree G2)) ^ (degree G2 - degree (if even (degree G1 - degree G2) then - pseudo_mod G1 G2 else pseudo_mod G1 G2)) else lead_coeff G2 * (if degree G1 - degree G2 = 1 then lead_coeff G2 else lead_coeff G2 ^ (degree G1 - degree G2)) ^ (degree G2 - degree (if even (degree G1 - degree G2) then - pseudo_mod G1 G2 else pseudo_mod G1 G2)))) (degree (if even (degree G1 - degree G2) then - pseudo_mod G1 G2 else pseudo_mod G1 G2)) (degree G2 - degree (if even (degree G1 - degree G2) then - pseudo_mod G1 G2 else pseudo_mod G1 G2)) (if degree G1 - degree G2 = 1 then lead_coeff G2 else lead_coeff G2 ^ (degree G1 - degree G2)))
[PROOF STEP]
unfolding d1
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. (if pseudo_mod G1 G2 = 0 then fst (G2, lead_coeff G2 ^ d1) else if pseudo_mod G2 ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2) = 0 then fst ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2, if degree G2 - degree ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2) = 1 then lead_coeff ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2) else div_exp (lead_coeff ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2)) (lead_coeff G2 ^ d1) (degree G2 - degree ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2))) else gcd_impl_rec ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2) (sdiv_poly (pseudo_mod G2 ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2)) ((- (1::'a)) ^ (degree G2 - degree ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2) + 1) * lead_coeff G2 * (lead_coeff G2 ^ d1) ^ (degree G2 - degree ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2)))) (degree ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2)) (degree G2 - degree ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2)) (lead_coeff G2 ^ d1)) = (if pseudo_mod G1 G2 = 0 then G2 else if pseudo_mod G2 (if even d1 then - pseudo_mod G1 G2 else pseudo_mod G1 G2) = 0 then if even d1 then - pseudo_mod G1 G2 else pseudo_mod G1 G2 else gcd_impl_rec (if even d1 then - pseudo_mod G1 G2 else pseudo_mod G1 G2) (sdiv_poly (pseudo_mod G2 (if even d1 then - pseudo_mod G1 G2 else pseudo_mod G1 G2)) (if degree G2 - degree (if even d1 then - pseudo_mod G1 G2 else pseudo_mod G1 G2) = 1 then lead_coeff G2 * (if d1 = 1 then lead_coeff G2 else lead_coeff G2 ^ d1) else if even (degree G2 - degree (if even d1 then - pseudo_mod G1 G2 else pseudo_mod G1 G2)) then - lead_coeff G2 * (if d1 = 1 then lead_coeff G2 else lead_coeff G2 ^ d1) ^ (degree G2 - degree (if even d1 then - pseudo_mod G1 G2 else pseudo_mod G1 G2)) else lead_coeff G2 * (if d1 = 1 then lead_coeff G2 else lead_coeff G2 ^ d1) ^ (degree G2 - degree (if even d1 then - pseudo_mod G1 G2 else pseudo_mod G1 G2)))) (degree (if even d1 then - pseudo_mod G1 G2 else pseudo_mod G1 G2)) (degree G2 - degree (if even d1 then - pseudo_mod G1 G2 else pseudo_mod G1 G2)) (if d1 = 1 then lead_coeff G2 else lead_coeff G2 ^ d1))
[PROOF STEP]
unfolding id1
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. (if pseudo_mod G1 G2 = 0 then fst (G2, lead_coeff G2 ^ d1) else if pseudo_mod G2 ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2) = 0 then fst ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2, if degree G2 - degree ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2) = 1 then lead_coeff ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2) else div_exp (lead_coeff ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2)) (lead_coeff G2 ^ d1) (degree G2 - degree ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2))) else gcd_impl_rec ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2) (sdiv_poly (pseudo_mod G2 ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2)) ((- (1::'a)) ^ (degree G2 - degree ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2) + 1) * lead_coeff G2 * (lead_coeff G2 ^ d1) ^ (degree G2 - degree ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2)))) (degree ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2)) (degree G2 - degree ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2)) (lead_coeff G2 ^ d1)) = (if pseudo_mod G1 G2 = 0 then G2 else if pseudo_mod G2 ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2) = 0 then (- 1) ^ (d1 + 1) * pseudo_mod G1 G2 else gcd_impl_rec ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2) (sdiv_poly (pseudo_mod G2 ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2)) (if degree G2 - degree ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2) = 1 then lead_coeff G2 * (if d1 = 1 then lead_coeff G2 else lead_coeff G2 ^ d1) else if even (degree G2 - degree ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2)) then - lead_coeff G2 * (if d1 = 1 then lead_coeff G2 else lead_coeff G2 ^ d1) ^ (degree G2 - degree ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2)) else lead_coeff G2 * (if d1 = 1 then lead_coeff G2 else lead_coeff G2 ^ d1) ^ (degree G2 - degree ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2)))) (degree ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2)) (degree G2 - degree ((- 1) ^ (d1 + 1) * pseudo_mod G1 G2)) (if d1 = 1 then lead_coeff G2 else lead_coeff G2 ^ d1))
[PROOF STEP]
by (rule if_cong, auto)
[PROOF STATE]
proof (state)
this:
gcd_impl_start G1 G2 = (let pmod = pseudo_mod G1 G2 in if pmod = 0 then G2 else let n2 = degree G2; n1 = degree G1; d1 = n1 - n2; G3 = if even d1 then - pmod else pmod; pmod = pseudo_mod G2 G3 in if pmod = 0 then G3 else let g2 = lead_coeff G2; n3 = degree G3; h2 = if d1 = 1 then g2 else g2 ^ d1; d2 = n2 - n3; divisor = if d2 = 1 then g2 * h2 else if even d2 then - g2 * h2 ^ d2 else g2 * h2 ^ d2; G4 = sdiv_poly pmod divisor in gcd_impl_rec G3 G4 n3 d2 h2)

goal:
No subgoals!
[PROOF STEP]
qed


[STATEMENT]
lemma SUP_le_iff: "small (f ` A) \<Longrightarrow> \<Squnion>(f ` A) \<le> u \<longleftrightarrow> (\<forall>x\<in>A. f x \<le> u)" for f :: "V \<Rightarrow> V"
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. small (f ` A) \<Longrightarrow> (\<Squnion> (f ` A) \<le> u) = (\<forall>x\<in>A. f x \<le> u)
[PROOF STEP]
by blast


[STATEMENT]
lemma word_of_int_2p: "(word_of_int (2 ^ n) :: 'a::len word) = 2 ^ n"
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. word_of_int (2 ^ n) = 2 ^ n
[PROOF STEP]
by (induct n) (simp_all add: wi_hom_syms)


[STATEMENT]
lemma real_eqI: "a - b = 0 \<Longrightarrow> a = (b::real)"
[PROOF STATE]
proof (prove)
goal (1 subgoal):
 1. a - b = 0 \<Longrightarrow> a = b
[PROOF STEP]
by simp