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 |