src/HOL/Library/Formal_Power_Series.thy
changeset 47108 2a1953f0d20d
parent 46757 ad878aff9c15
child 47217 501b9bbd0d6e
equal deleted inserted replaced
47107:35807a5d8dc2 47108:2a1953f0d20d
   390 
   390 
   391 instance fps :: (ring_1_no_zero_divisors) ring_1_no_zero_divisors ..
   391 instance fps :: (ring_1_no_zero_divisors) ring_1_no_zero_divisors ..
   392 
   392 
   393 instance fps :: (idom) idom ..
   393 instance fps :: (idom) idom ..
   394 
   394 
   395 instantiation fps :: (comm_ring_1) number_ring
   395 lemma numeral_fps_const: "numeral k = fps_const (numeral k)"
   396 begin
   396   by (induct k, simp_all only: numeral.simps fps_const_1_eq_1
   397 definition number_of_fps_def: "(number_of k::'a fps) = of_int k"
   397     fps_const_add [symmetric])
   398 
   398 
   399 instance proof
   399 lemma neg_numeral_fps_const: "neg_numeral k = fps_const (neg_numeral k)"
   400 qed (rule number_of_fps_def)
   400   by (simp only: neg_numeral_def numeral_fps_const fps_const_neg)
   401 end
   401 
   402 
       
   403 lemma number_of_fps_const: "(number_of k::('a::comm_ring_1) fps) = fps_const (of_int k)"
       
   404   
       
   405 proof(induct k rule: int_induct [where k=0])
       
   406   case base thus ?case unfolding number_of_fps_def of_int_0 by simp
       
   407 next
       
   408   case (step1 i) thus ?case unfolding number_of_fps_def 
       
   409     by (simp add: fps_const_add[symmetric] del: fps_const_add)
       
   410 next
       
   411   case (step2 i) thus ?case unfolding number_of_fps_def 
       
   412     by (simp add: fps_const_sub[symmetric] del: fps_const_sub)
       
   413 qed
       
   414 subsection{* The eXtractor series X*}
   402 subsection{* The eXtractor series X*}
   415 
   403 
   416 lemma minus_one_power_iff: "(- (1::'a :: {comm_ring_1})) ^ n = (if even n then 1 else - 1)"
   404 lemma minus_one_power_iff: "(- (1::'a :: {comm_ring_1})) ^ n = (if even n then 1 else - 1)"
   417   by (induct n, auto)
   405   by (induct n, auto)
   418 
   406 
  1117   "inverse (1 + X) = Abs_fps (\<lambda>n. (- (1::'a::{field})) ^ n)" (is "_ = ?r")
  1105   "inverse (1 + X) = Abs_fps (\<lambda>n. (- (1::'a::{field})) ^ n)" (is "_ = ?r")
  1118 proof-
  1106 proof-
  1119   have eq: "(1 + X) * ?r = 1"
  1107   have eq: "(1 + X) * ?r = 1"
  1120     unfolding minus_one_power_iff
  1108     unfolding minus_one_power_iff
  1121     by (auto simp add: field_simps fps_eq_iff)
  1109     by (auto simp add: field_simps fps_eq_iff)
  1122   show ?thesis by (auto simp add: eq intro: fps_inverse_unique)
  1110   show ?thesis by (auto simp add: eq intro: fps_inverse_unique simp del: minus_one)
  1123 qed
  1111 qed
  1124 
  1112 
  1125 
  1113 
  1126 subsection{* Integration *}
  1114 subsection{* Integration *}
  1127 
  1115 
  1155 
  1143 
  1156 lemma fps_const_compose[simp]:
  1144 lemma fps_const_compose[simp]:
  1157   "fps_const (a::'a::{comm_ring_1}) oo b = fps_const (a)"
  1145   "fps_const (a::'a::{comm_ring_1}) oo b = fps_const (a)"
  1158   by (simp add: fps_eq_iff fps_compose_nth mult_delta_left setsum_delta)
  1146   by (simp add: fps_eq_iff fps_compose_nth mult_delta_left setsum_delta)
  1159 
  1147 
  1160 lemma number_of_compose[simp]: "(number_of k::('a::{comm_ring_1}) fps) oo b = number_of k"
  1148 lemma numeral_compose[simp]: "(numeral k::('a::{comm_ring_1}) fps) oo b = numeral k"
  1161   unfolding number_of_fps_const by simp
  1149   unfolding numeral_fps_const by simp
       
  1150 
       
  1151 lemma neg_numeral_compose[simp]: "(neg_numeral k::('a::{comm_ring_1}) fps) oo b = neg_numeral k"
       
  1152   unfolding neg_numeral_fps_const by simp
  1162 
  1153 
  1163 lemma X_fps_compose_startby0[simp]: "a$0 = 0 \<Longrightarrow> X oo a = (a :: ('a :: comm_ring_1) fps)"
  1154 lemma X_fps_compose_startby0[simp]: "a$0 = 0 \<Longrightarrow> X oo a = (a :: ('a :: comm_ring_1) fps)"
  1164   by (simp add: fps_eq_iff fps_compose_def mult_delta_left setsum_delta
  1155   by (simp add: fps_eq_iff fps_compose_def mult_delta_left setsum_delta
  1165                 power_Suc not_le)
  1156                 power_Suc not_le)
  1166 
  1157 
  2566 lemma inverse_one_plus_X:
  2557 lemma inverse_one_plus_X:
  2567   "inverse (1 + X) = Abs_fps (\<lambda>n. (- 1 ::'a::{field})^n)"
  2558   "inverse (1 + X) = Abs_fps (\<lambda>n. (- 1 ::'a::{field})^n)"
  2568   (is "inverse ?l = ?r")
  2559   (is "inverse ?l = ?r")
  2569 proof-
  2560 proof-
  2570   have th: "?l * ?r = 1"
  2561   have th: "?l * ?r = 1"
  2571     by (auto simp add: field_simps fps_eq_iff minus_one_power_iff)
  2562     by (auto simp add: field_simps fps_eq_iff minus_one_power_iff simp del: minus_one)
  2572   have th': "?l $ 0 \<noteq> 0" by (simp add: )
  2563   have th': "?l $ 0 \<noteq> 0" by (simp add: )
  2573   from fps_inverse_unique[OF th' th] show ?thesis .
  2564   from fps_inverse_unique[OF th' th] show ?thesis .
  2574 qed
  2565 qed
  2575 
  2566 
  2576 lemma E_power_mult: "(E (c::'a::field_char_0))^n = E (of_nat n * c)"
  2567 lemma E_power_mult: "(E (c::'a::field_char_0))^n = E (of_nat n * c)"
  2763 lemma fps_minomial_minus_one: "fps_binomial (- 1) = inverse (1 + X)"
  2754 lemma fps_minomial_minus_one: "fps_binomial (- 1) = inverse (1 + X)"
  2764   (is "?l = inverse ?r")
  2755   (is "?l = inverse ?r")
  2765 proof-
  2756 proof-
  2766   have th: "?r$0 \<noteq> 0" by simp
  2757   have th: "?r$0 \<noteq> 0" by simp
  2767   have th': "fps_deriv (inverse ?r) = fps_const (- 1) * inverse ?r / (1 + X)"
  2758   have th': "fps_deriv (inverse ?r) = fps_const (- 1) * inverse ?r / (1 + X)"
  2768     by (simp add: fps_inverse_deriv[OF th] fps_divide_def power2_eq_square mult_commute fps_const_neg[symmetric] del: fps_const_neg)
  2759     by (simp add: fps_inverse_deriv[OF th] fps_divide_def power2_eq_square mult_commute fps_const_neg[symmetric] del: fps_const_neg minus_one)
  2769   have eq: "inverse ?r $ 0 = 1"
  2760   have eq: "inverse ?r $ 0 = 1"
  2770     by (simp add: fps_inverse_def)
  2761     by (simp add: fps_inverse_def)
  2771   from iffD1[OF fps_binomial_ODE_unique[of "inverse (1 + X)" "- 1"] th'] eq
  2762   from iffD1[OF fps_binomial_ODE_unique[of "inverse (1 + X)" "- 1"] th'] eq
  2772   show ?thesis by (simp add: fps_inverse_def)
  2763   show ?thesis by (simp add: fps_inverse_def)
  2773 qed
  2764 qed
  2853         
  2844         
  2854         have th1: "(?m1 k * ?p (of_nat n) k) / ?f n = 1 / of_nat(fact (n - k))"
  2845         have th1: "(?m1 k * ?p (of_nat n) k) / ?f n = 1 / of_nat(fact (n - k))"
  2855           unfolding m1nk 
  2846           unfolding m1nk 
  2856           
  2847           
  2857           unfolding m h pochhammer_Suc_setprod
  2848           unfolding m h pochhammer_Suc_setprod
  2858           apply (simp add: field_simps del: fact_Suc id_def)
  2849           apply (simp add: field_simps del: fact_Suc id_def minus_one)
  2859           unfolding fact_altdef_nat id_def
  2850           unfolding fact_altdef_nat id_def
  2860           unfolding of_nat_setprod
  2851           unfolding of_nat_setprod
  2861           unfolding setprod_timesf[symmetric]
  2852           unfolding setprod_timesf[symmetric]
  2862           apply auto
  2853           apply auto
  2863           unfolding eq1
  2854           unfolding eq1
  3160   unfolding minus_mult_right Eii_sin_cos by (simp add: fps_sin_even fps_cos_odd)
  3151   unfolding minus_mult_right Eii_sin_cos by (simp add: fps_sin_even fps_cos_odd)
  3161 
  3152 
  3162 lemma fps_const_minus: "fps_const (c::'a::group_add) - fps_const d = fps_const (c - d)"
  3153 lemma fps_const_minus: "fps_const (c::'a::group_add) - fps_const d = fps_const (c - d)"
  3163   by (simp add: fps_eq_iff fps_const_def)
  3154   by (simp add: fps_eq_iff fps_const_def)
  3164 
  3155 
  3165 lemma fps_number_of_fps_const: "number_of i = fps_const (number_of i :: 'a:: {comm_ring_1, number_ring})"
  3156 lemma fps_numeral_fps_const: "numeral i = fps_const (numeral i :: 'a:: {comm_ring_1})"
  3166   apply (subst (2) number_of_eq)
  3157   by (fact numeral_fps_const) (* FIXME: duplicate *)
  3167 apply(rule int_induct [of _ 0])
       
  3168 apply (simp_all add: number_of_fps_def)
       
  3169 by (simp_all add: fps_const_add[symmetric] fps_const_minus[symmetric])
       
  3170 
  3158 
  3171 lemma fps_cos_Eii:
  3159 lemma fps_cos_Eii:
  3172   "fps_cos c = (E (ii * c) + E (- ii * c)) / fps_const 2"
  3160   "fps_cos c = (E (ii * c) + E (- ii * c)) / fps_const 2"
  3173 proof-
  3161 proof-
  3174   have th: "fps_cos c + fps_cos c = fps_cos c * fps_const 2" 
  3162   have th: "fps_cos c + fps_cos c = fps_cos c * fps_const 2" 
  3175     by (simp add: fps_eq_iff fps_number_of_fps_const complex_number_of_def[symmetric])
  3163     by (simp add: numeral_fps_const)
  3176   show ?thesis
  3164   show ?thesis
  3177   unfolding Eii_sin_cos minus_mult_commute
  3165   unfolding Eii_sin_cos minus_mult_commute
  3178   by (simp add: fps_sin_even fps_cos_odd fps_number_of_fps_const
  3166   by (simp add: fps_sin_even fps_cos_odd numeral_fps_const
  3179     fps_divide_def fps_const_inverse th complex_number_of_def[symmetric])
  3167     fps_divide_def fps_const_inverse th)
  3180 qed
  3168 qed
  3181 
  3169 
  3182 lemma fps_sin_Eii:
  3170 lemma fps_sin_Eii:
  3183   "fps_sin c = (E (ii * c) - E (- ii * c)) / fps_const (2*ii)"
  3171   "fps_sin c = (E (ii * c) - E (- ii * c)) / fps_const (2*ii)"
  3184 proof-
  3172 proof-
  3185   have th: "fps_const \<i> * fps_sin c + fps_const \<i> * fps_sin c = fps_sin c * fps_const (2 * ii)" 
  3173   have th: "fps_const \<i> * fps_sin c + fps_const \<i> * fps_sin c = fps_sin c * fps_const (2 * ii)" 
  3186     by (simp add: fps_eq_iff fps_number_of_fps_const complex_number_of_def[symmetric])
  3174     by (simp add: fps_eq_iff numeral_fps_const)
  3187   show ?thesis
  3175   show ?thesis
  3188   unfolding Eii_sin_cos minus_mult_commute
  3176   unfolding Eii_sin_cos minus_mult_commute
  3189   by (simp add: fps_sin_even fps_cos_odd fps_divide_def fps_const_inverse th)
  3177   by (simp add: fps_sin_even fps_cos_odd fps_divide_def fps_const_inverse th)
  3190 qed
  3178 qed
  3191 
  3179