src/HOL/Library/Formal_Power_Series.thy
changeset 57514 bdc2c6b40bf2
parent 57512 cc97b347b301
child 58681 a478a0742a8e
equal deleted inserted replaced
57513:55b2afc5ddfc 57514:bdc2c6b40bf2
   556     using ln_gt_zero_iff[OF yp] y1
   556     using ln_gt_zero_iff[OF yp] y1
   557     by (simp add: minus_divide_left field_simps del: minus_divide_left[symmetric])
   557     by (simp add: minus_divide_left field_simps del: minus_divide_left[symmetric])
   558   then have "ln y * real k + ln x > 0"
   558   then have "ln y * real k + ln x > 0"
   559     by simp
   559     by simp
   560   then have "exp (real k * ln y + ln x) > exp 0"
   560   then have "exp (real k * ln y + ln x) > exp 0"
   561     by (simp add: mult_ac)
   561     by (simp add: ac_simps)
   562   then have "y ^ k * x > 1"
   562   then have "y ^ k * x > 1"
   563     unfolding exp_zero exp_add exp_real_of_nat_mult exp_ln [OF xp] exp_ln [OF yp]
   563     unfolding exp_zero exp_add exp_real_of_nat_mult exp_ln [OF xp] exp_ln [OF yp]
   564     by simp
   564     by simp
   565   then have "x > (1 / y)^k" using yp
   565   then have "x > (1 / y)^k" using yp
   566     by (simp add: field_simps nonzero_power_divide)
   566     by (simp add: field_simps nonzero_power_divide)
   722   shows "inverse (inverse f) = f"
   722   shows "inverse (inverse f) = f"
   723 proof -
   723 proof -
   724   from f0 have if0: "inverse f $ 0 \<noteq> 0" by simp
   724   from f0 have if0: "inverse f $ 0 \<noteq> 0" by simp
   725   from inverse_mult_eq_1[OF f0] inverse_mult_eq_1[OF if0]
   725   from inverse_mult_eq_1[OF f0] inverse_mult_eq_1[OF if0]
   726   have "inverse f * f = inverse f * inverse (inverse f)"
   726   have "inverse f * f = inverse f * inverse (inverse f)"
   727     by (simp add: mult_ac)
   727     by (simp add: ac_simps)
   728   then show ?thesis
   728   then show ?thesis
   729     using f0 unfolding mult_cancel_left by simp
   729     using f0 unfolding mult_cancel_left by simp
   730 qed
   730 qed
   731 
   731 
   732 lemma fps_inverse_unique:
   732 lemma fps_inverse_unique:
   734     and fg: "f*g = 1"
   734     and fg: "f*g = 1"
   735   shows "inverse f = g"
   735   shows "inverse f = g"
   736 proof -
   736 proof -
   737   from inverse_mult_eq_1[OF f0] fg
   737   from inverse_mult_eq_1[OF f0] fg
   738   have th0: "inverse f * f = g * f"
   738   have th0: "inverse f * f = g * f"
   739     by (simp add: mult_ac)
   739     by (simp add: ac_simps)
   740   then show ?thesis
   740   then show ?thesis
   741     using f0
   741     using f0
   742     unfolding mult_cancel_right
   742     unfolding mult_cancel_right
   743     by (auto simp add: expand_fps_eq)
   743     by (auto simp add: expand_fps_eq)
   744 qed
   744 qed
  1398     by simp
  1398     by simp
  1399   have "a /?X = ?X *  Abs_fps (\<lambda>n::nat. setsum (op $ a) {0..n}) * inverse ?X"
  1399   have "a /?X = ?X *  Abs_fps (\<lambda>n::nat. setsum (op $ a) {0..n}) * inverse ?X"
  1400     using fps_divide_X_minus1_setsum_lemma[of a, symmetric] th0
  1400     using fps_divide_X_minus1_setsum_lemma[of a, symmetric] th0
  1401     by (simp add: fps_divide_def mult.assoc)
  1401     by (simp add: fps_divide_def mult.assoc)
  1402   also have "\<dots> = (inverse ?X * ?X) * Abs_fps (\<lambda>n::nat. setsum (op $ a) {0..n}) "
  1402   also have "\<dots> = (inverse ?X * ?X) * Abs_fps (\<lambda>n::nat. setsum (op $ a) {0..n}) "
  1403     by (simp add: mult_ac)
  1403     by (simp add: ac_simps)
  1404   finally show ?thesis
  1404   finally show ?thesis
  1405     by (simp add: inverse_mult_eq_1[OF th0])
  1405     by (simp add: inverse_mult_eq_1[OF th0])
  1406 qed
  1406 qed
  1407 
  1407 
  1408 
  1408 
  2072         then have "a$n = (b$n - setsum ?f ?Pnknn) / (of_nat (k+1) * (?r $ 0)^k)"
  2072         then have "a$n = (b$n - setsum ?f ?Pnknn) / (of_nat (k+1) * (?r $ 0)^k)"
  2073           apply -
  2073           apply -
  2074           apply (rule eq_divide_imp')
  2074           apply (rule eq_divide_imp')
  2075           using r00
  2075           using r00
  2076           apply (simp del: of_nat_Suc)
  2076           apply (simp del: of_nat_Suc)
  2077           apply (simp add: mult_ac)
  2077           apply (simp add: ac_simps)
  2078           done
  2078           done
  2079         then have "a$n = ?r $n"
  2079         then have "a$n = ?r $n"
  2080           apply (simp del: of_nat_Suc)
  2080           apply (simp del: of_nat_Suc)
  2081           unfolding fps_radical_def n1
  2081           unfolding fps_radical_def n1
  2082           apply (simp add: field_simps n1 th00 del: of_nat_Suc)
  2082           apply (simp add: field_simps n1 th00 del: of_nat_Suc)
  2126   let ?iw = "inverse ?w"
  2126   let ?iw = "inverse ?w"
  2127   from iffD1[OF power_radical[of a r], OF a0 r0]
  2127   from iffD1[OF power_radical[of a r], OF a0 r0]
  2128   have "fps_deriv (?r ^ Suc k) = fps_deriv a"
  2128   have "fps_deriv (?r ^ Suc k) = fps_deriv a"
  2129     by simp
  2129     by simp
  2130   then have "fps_deriv ?r * ?w = fps_deriv a"
  2130   then have "fps_deriv ?r * ?w = fps_deriv a"
  2131     by (simp add: fps_deriv_power mult_ac del: power_Suc)
  2131     by (simp add: fps_deriv_power ac_simps del: power_Suc)
  2132   then have "?iw * fps_deriv ?r * ?w = ?iw * fps_deriv a"
  2132   then have "?iw * fps_deriv ?r * ?w = ?iw * fps_deriv a"
  2133     by simp
  2133     by simp
  2134   then have "fps_deriv ?r * (?iw * ?w) = fps_deriv a / ?w"
  2134   then have "fps_deriv ?r * (?iw * ?w) = fps_deriv a / ?w"
  2135     by (simp add: fps_divide_def)
  2135     by (simp add: fps_divide_def)
  2136   then show ?thesis unfolding th0 by simp
  2136   then show ?thesis unfolding th0 by simp
  2292       by (rule setsum.reindex_cong [of Suc]) (auto simp add: mult.assoc)
  2292       by (rule setsum.reindex_cong [of Suc]) (auto simp add: mult.assoc)
  2293     finally have th0: "(fps_deriv (a oo b))$n =
  2293     finally have th0: "(fps_deriv (a oo b))$n =
  2294       setsum (\<lambda>i. of_nat (i + 1) * a$(i+1) * (setsum (\<lambda>j. (b^ i)$j * of_nat (n - j + 1) * b$(n - j + 1)) {0..n})) {0.. n}" .
  2294       setsum (\<lambda>i. of_nat (i + 1) * a$(i+1) * (setsum (\<lambda>j. (b^ i)$j * of_nat (n - j + 1) * b$(n - j + 1)) {0..n})) {0.. n}" .
  2295 
  2295 
  2296     have "(((fps_deriv a) oo b) * (fps_deriv b))$n = setsum (\<lambda>i. (fps_deriv b)$ (n - i) * ((fps_deriv a) oo b)$i) {0..n}"
  2296     have "(((fps_deriv a) oo b) * (fps_deriv b))$n = setsum (\<lambda>i. (fps_deriv b)$ (n - i) * ((fps_deriv a) oo b)$i) {0..n}"
  2297       unfolding fps_mult_nth by (simp add: mult_ac)
  2297       unfolding fps_mult_nth by (simp add: ac_simps)
  2298     also have "\<dots> = setsum (\<lambda>i. setsum (\<lambda>j. of_nat (n - i +1) * b$(n - i + 1) * of_nat (j + 1) * a$(j+1) * (b^j)$i) {0..n}) {0..n}"
  2298     also have "\<dots> = setsum (\<lambda>i. setsum (\<lambda>j. of_nat (n - i +1) * b$(n - i + 1) * of_nat (j + 1) * a$(j+1) * (b^j)$i) {0..n}) {0..n}"
  2299       unfolding fps_deriv_nth fps_compose_nth setsum_right_distrib mult.assoc
  2299       unfolding fps_deriv_nth fps_compose_nth setsum_right_distrib mult.assoc
  2300       apply (rule setsum.cong)
  2300       apply (rule setsum.cong)
  2301       apply (rule refl)
  2301       apply (rule refl)
  2302       apply (rule setsum.mono_neutral_left)
  2302       apply (rule setsum.mono_neutral_left)
  3530   apply (simp add: nat_add_1_add_1 fps_sin_nth_add_2
  3530   apply (simp add: nat_add_1_add_1 fps_sin_nth_add_2
  3531               del: One_nat_def of_nat_Suc of_nat_add add_2_eq_Suc')
  3531               del: One_nat_def of_nat_Suc of_nat_add add_2_eq_Suc')
  3532   apply (subst minus_divide_left)
  3532   apply (subst minus_divide_left)
  3533   apply (subst eq_divide_iff)
  3533   apply (subst eq_divide_iff)
  3534   apply (simp del: of_nat_add of_nat_Suc)
  3534   apply (simp del: of_nat_add of_nat_Suc)
  3535   apply (simp only: mult_ac)
  3535   apply (simp only: ac_simps)
  3536   done
  3536   done
  3537 
  3537 
  3538 lemma eq_fps_cos:
  3538 lemma eq_fps_cos:
  3539   assumes 0: "a $ 0 = 1"
  3539   assumes 0: "a $ 0 = 1"
  3540     and 1: "a $ 1 = 0"
  3540     and 1: "a $ 1 = 0"
  3548   apply (simp add: nat_add_1_add_1 fps_cos_nth_add_2
  3548   apply (simp add: nat_add_1_add_1 fps_cos_nth_add_2
  3549               del: One_nat_def of_nat_Suc of_nat_add add_2_eq_Suc')
  3549               del: One_nat_def of_nat_Suc of_nat_add add_2_eq_Suc')
  3550   apply (subst minus_divide_left)
  3550   apply (subst minus_divide_left)
  3551   apply (subst eq_divide_iff)
  3551   apply (subst eq_divide_iff)
  3552   apply (simp del: of_nat_add of_nat_Suc)
  3552   apply (simp del: of_nat_add of_nat_Suc)
  3553   apply (simp only: mult_ac)
  3553   apply (simp only: ac_simps)
  3554   done
  3554   done
  3555 
  3555 
  3556 lemma mult_nth_0 [simp]: "(a * b) $ 0 = a $ 0 * b $ 0"
  3556 lemma mult_nth_0 [simp]: "(a * b) $ 0 = a $ 0 * b $ 0"
  3557   by (simp add: fps_mult_nth)
  3557   by (simp add: fps_mult_nth)
  3558 
  3558 
  3653   apply simp
  3653   apply simp
  3654   done
  3654   done
  3655 
  3655 
  3656 lemma fps_demoivre: "(fps_cos a + fps_const ii * fps_sin a)^n = fps_cos (of_nat n * a) + fps_const ii * fps_sin (of_nat n * a)"
  3656 lemma fps_demoivre: "(fps_cos a + fps_const ii * fps_sin a)^n = fps_cos (of_nat n * a) + fps_const ii * fps_sin (of_nat n * a)"
  3657   unfolding Eii_sin_cos[symmetric] E_power_mult
  3657   unfolding Eii_sin_cos[symmetric] E_power_mult
  3658   by (simp add: mult_ac)
  3658   by (simp add: ac_simps)
  3659 
  3659 
  3660 
  3660 
  3661 subsection {* Hypergeometric series *}
  3661 subsection {* Hypergeometric series *}
  3662 
  3662 
  3663 definition "F as bs (c::'a::{field_char_0,field_inverse_zero}) =
  3663 definition "F as bs (c::'a::{field_char_0,field_inverse_zero}) =