# HG changeset patch # User huffman # Date 1231883301 28800 # Node ID 4a2482e16934894216be37f95b4896e7ccfaf5f2 # Parent 68e88293708f1cfe25f3a457eb4bd901c5fa100e code generation for polynomials diff -r 68e88293708f -r 4a2482e16934 src/HOL/Fundamental_Theorem_Algebra.thy --- a/src/HOL/Fundamental_Theorem_Algebra.thy Tue Jan 13 13:02:16 2009 -0800 +++ b/src/HOL/Fundamental_Theorem_Algebra.thy Tue Jan 13 13:48:21 2009 -0800 @@ -134,7 +134,7 @@ apply (simp add: offset_poly_eq_0_iff) done -definition [code del]: +definition "plength p = (if p = 0 then 0 else Suc (degree p))" lemma plength_eq_0_iff [simp]: "plength p = 0 \ p = 0" diff -r 68e88293708f -r 4a2482e16934 src/HOL/Polynomial.thy --- a/src/HOL/Polynomial.thy Tue Jan 13 13:02:16 2009 -0800 +++ b/src/HOL/Polynomial.thy Tue Jan 13 13:48:21 2009 -0800 @@ -910,7 +910,7 @@ definition synthetic_divmod :: "'a::comm_semiring_0 poly \ 'a \ 'a poly \ 'a" -where +where [code del]: "synthetic_divmod p c = poly_rec (0, 0) (\a p (q, r). (pCons r q, a + c * r)) p" @@ -1019,4 +1019,96 @@ qed qed + +subsection {* Configuration of the code generator *} + +code_datatype "0::'a::zero poly" pCons + +instantiation poly :: ("{zero,eq}") eq +begin + +definition [code del]: + "eq_class.eq (p::'a poly) q \ p = q" + +instance + by default (rule eq_poly_def) + end + +lemma eq_poly_code [code]: + "eq_class.eq (0::_ poly) (0::_ poly) \ True" + "eq_class.eq (0::_ poly) (pCons b q) \ eq_class.eq 0 b \ eq_class.eq 0 q" + "eq_class.eq (pCons a p) (0::_ poly) \ eq_class.eq a 0 \ eq_class.eq p 0" + "eq_class.eq (pCons a p) (pCons b q) \ eq_class.eq a b \ eq_class.eq p q" +unfolding eq by simp_all + +lemmas coeff_code [code] = + coeff_0 coeff_pCons_0 coeff_pCons_Suc + +lemmas degree_code [code] = + degree_0 degree_pCons_eq_if + +lemmas monom_poly_code [code] = + monom_0 monom_Suc + +lemma add_poly_code [code]: + "0 + q = (q :: _ poly)" + "p + 0 = (p :: _ poly)" + "pCons a p + pCons b q = pCons (a + b) (p + q)" +by simp_all + +lemma minus_poly_code [code]: + "- 0 = (0 :: _ poly)" + "- pCons a p = pCons (- a) (- p)" +by simp_all + +lemma diff_poly_code [code]: + "0 - q = (- q :: _ poly)" + "p - 0 = (p :: _ poly)" + "pCons a p - pCons b q = pCons (a - b) (p - q)" +by simp_all + +lemmas smult_poly_code [code] = + smult_0_right smult_pCons + +lemma mult_poly_code [code]: + "0 * q = (0 :: _ poly)" + "pCons a p * q = smult a q + pCons 0 (p * q)" +by simp_all + +lemmas poly_code [code] = + poly_0 poly_pCons + +lemmas synthetic_divmod_code [code] = + synthetic_divmod_0 synthetic_divmod_pCons + +text {* code generator setup for div and mod *} + +definition + divmod_poly :: "'a::field poly \ 'a poly \ 'a poly \ 'a poly" +where + [code del]: "divmod_poly x y = (x div y, x mod y)" + +lemma div_poly_code [code]: "x div y = fst (divmod_poly x y)" + unfolding divmod_poly_def by simp + +lemma mod_poly_code [code]: "x mod y = snd (divmod_poly x y)" + unfolding divmod_poly_def by simp + +lemma divmod_poly_0 [code]: "divmod_poly 0 y = (0, 0)" + unfolding divmod_poly_def by simp + +lemma divmod_poly_pCons [code]: + "divmod_poly (pCons a x) y = + (if y = 0 then (0, pCons a x) else + (let (q, r) = divmod_poly x y; + b = coeff (pCons a r) (degree y) / coeff y (degree y) + in (pCons b q, pCons a r - smult b y)))" +apply (simp add: divmod_poly_def Let_def, safe) +apply (rule div_poly_eq) +apply (erule divmod_poly_rel_pCons [OF divmod_poly_rel _ refl]) +apply (rule mod_poly_eq) +apply (erule divmod_poly_rel_pCons [OF divmod_poly_rel _ refl]) +done + +end