58 apply (subgoal_tac "k = 0 | 0 < k", auto) |
59 apply (subgoal_tac "k = 0 | 0 < k", auto) |
59 apply (induct "n") |
60 apply (induct "n") |
60 apply (simp_all add: setsum_add_nat_ivl add_commute) |
61 apply (simp_all add: setsum_add_nat_ivl add_commute) |
61 done |
62 done |
62 |
63 |
|
64 (* FIXME generalize? *) |
|
65 lemma sumr_offset: |
|
66 "(\<Sum>m=0..<n::nat. f(m+k)::real) = setsum f {0..<n+k} - setsum f {0..<k}" |
|
67 by (induct "n", auto) |
|
68 |
|
69 lemma sumr_offset2: |
|
70 "\<forall>f. (\<Sum>m=0..<n::nat. f(m+k)::real) = setsum f {0..<n+k} - setsum f {0..<k}" |
|
71 by (induct "n", auto) |
|
72 |
|
73 lemma sumr_offset3: |
|
74 "setsum f {0::nat..<n+k} = (\<Sum>m=0..<n. f (m+k)::real) + setsum f {0..<k}" |
|
75 by (simp add: sumr_offset) |
|
76 |
|
77 lemma sumr_offset4: |
|
78 "\<forall>n f. setsum f {0::nat..<n+k} = |
|
79 (\<Sum>m=0..<n. f (m+k)::real) + setsum f {0..<k}" |
|
80 by (simp add: sumr_offset) |
|
81 |
|
82 (* |
|
83 lemma sumr_from_1_from_0: "0 < n ==> |
|
84 (\<Sum>n=Suc 0 ..< Suc n. if even(n) then 0 else |
|
85 ((- 1) ^ ((n - (Suc 0)) div 2))/(real (fact n))) * a ^ n = |
|
86 (\<Sum>n=0..<Suc n. if even(n) then 0 else |
|
87 ((- 1) ^ ((n - (Suc 0)) div 2))/(real (fact n))) * a ^ n" |
|
88 by (rule_tac n1 = 1 in sumr_split_add [THEN subst], auto) |
|
89 *) |
63 |
90 |
64 subsection{* Infinite Sums, by the Properties of Limits*} |
91 subsection{* Infinite Sums, by the Properties of Limits*} |
65 |
92 |
66 (*---------------------- |
93 (*---------------------- |
67 suminf is the sum |
94 suminf is the sum |
86 lemma sums_unique: "f sums s ==> (s = suminf f)" |
113 lemma sums_unique: "f sums s ==> (s = suminf f)" |
87 apply (frule sums_summable [THEN summable_sums]) |
114 apply (frule sums_summable [THEN summable_sums]) |
88 apply (auto intro!: LIMSEQ_unique simp add: sums_def) |
115 apply (auto intro!: LIMSEQ_unique simp add: sums_def) |
89 done |
116 done |
90 |
117 |
|
118 lemma sums_split_initial_segment: "f sums s ==> |
|
119 (%n. f(n + k)) sums (s - (SUM i = 0..< k. f i))" |
|
120 apply (unfold sums_def); |
|
121 apply (simp add: sumr_offset); |
|
122 apply (rule LIMSEQ_diff_const) |
|
123 apply (rule LIMSEQ_ignore_initial_segment) |
|
124 apply assumption |
|
125 done |
|
126 |
|
127 lemma summable_ignore_initial_segment: "summable f ==> |
|
128 summable (%n. f(n + k))" |
|
129 apply (unfold summable_def) |
|
130 apply (auto intro: sums_split_initial_segment) |
|
131 done |
|
132 |
|
133 lemma suminf_minus_initial_segment: "summable f ==> |
|
134 suminf f = s ==> suminf (%n. f(n + k)) = s - (SUM i = 0..< k. f i)" |
|
135 apply (frule summable_ignore_initial_segment) |
|
136 apply (rule sums_unique [THEN sym]) |
|
137 apply (frule summable_sums) |
|
138 apply (rule sums_split_initial_segment) |
|
139 apply auto |
|
140 done |
|
141 |
|
142 lemma suminf_split_initial_segment: "summable f ==> |
|
143 suminf f = (SUM i = 0..< k. f i) + suminf (%n. f(n + k))" |
|
144 by (auto simp add: suminf_minus_initial_segment) |
|
145 |
91 lemma series_zero: |
146 lemma series_zero: |
92 "(\<forall>m. n \<le> m --> f(m) = 0) ==> f sums (setsum f {0..<n})" |
147 "(\<forall>m. n \<le> m --> f(m) = 0) ==> f sums (setsum f {0..<n})" |
93 apply (simp add: sums_def LIMSEQ_def diff_minus[symmetric], safe) |
148 apply (simp add: sums_def LIMSEQ_def diff_minus[symmetric], safe) |
94 apply (rule_tac x = n in exI) |
149 apply (rule_tac x = n in exI) |
95 apply (clarsimp simp add:setsum_diff[symmetric] cong:setsum_ivl_cong) |
150 apply (clarsimp simp add:setsum_diff[symmetric] cong:setsum_ivl_cong) |
96 done |
151 done |
97 |
152 |
98 |
153 lemma sums_zero: "(%n. 0) sums 0"; |
99 lemma sums_mult: "x sums x0 ==> (%n. c * x(n)) sums (c * x0)" |
154 apply (unfold sums_def); |
|
155 apply simp; |
|
156 apply (rule LIMSEQ_const); |
|
157 done; |
|
158 |
|
159 lemma summable_zero: "summable (%n. 0)"; |
|
160 apply (rule sums_summable); |
|
161 apply (rule sums_zero); |
|
162 done; |
|
163 |
|
164 lemma suminf_zero: "suminf (%n. 0) = 0"; |
|
165 apply (rule sym); |
|
166 apply (rule sums_unique); |
|
167 apply (rule sums_zero); |
|
168 done; |
|
169 |
|
170 lemma sums_mult: "f sums a ==> (%n. c * f n) sums (c * a)" |
100 by (auto simp add: sums_def setsum_mult [symmetric] |
171 by (auto simp add: sums_def setsum_mult [symmetric] |
101 intro!: LIMSEQ_mult intro: LIMSEQ_const) |
172 intro!: LIMSEQ_mult intro: LIMSEQ_const) |
102 |
173 |
103 lemma sums_divide: "x sums x' ==> (%n. x(n)/c) sums (x'/c)" |
174 lemma summable_mult: "summable f ==> summable (%n. c * f n)"; |
|
175 apply (unfold summable_def); |
|
176 apply (auto intro: sums_mult); |
|
177 done; |
|
178 |
|
179 lemma suminf_mult: "summable f ==> suminf (%n. c * f n) = c * suminf f"; |
|
180 apply (rule sym); |
|
181 apply (rule sums_unique); |
|
182 apply (rule sums_mult); |
|
183 apply (erule summable_sums); |
|
184 done; |
|
185 |
|
186 lemma sums_mult2: "f sums a ==> (%n. f n * c) sums (a * c)" |
|
187 apply (subst mult_commute) |
|
188 apply (subst mult_commute);back; |
|
189 apply (erule sums_mult) |
|
190 done |
|
191 |
|
192 lemma summable_mult2: "summable f ==> summable (%n. f n * c)" |
|
193 apply (unfold summable_def) |
|
194 apply (auto intro: sums_mult2) |
|
195 done |
|
196 |
|
197 lemma suminf_mult2: "summable f ==> suminf f * c = (\<Sum>n. f n * c)" |
|
198 by (auto intro!: sums_unique sums_mult summable_sums simp add: mult_commute) |
|
199 |
|
200 lemma sums_divide: "f sums a ==> (%n. (f n)/c) sums (a/c)" |
104 by (simp add: real_divide_def sums_mult mult_commute [of _ "inverse c"]) |
201 by (simp add: real_divide_def sums_mult mult_commute [of _ "inverse c"]) |
|
202 |
|
203 lemma summable_divide: "summable f ==> summable (%n. (f n) / c)"; |
|
204 apply (unfold summable_def); |
|
205 apply (auto intro: sums_divide); |
|
206 done; |
|
207 |
|
208 lemma suminf_divide: "summable f ==> suminf (%n. (f n) / c) = (suminf f) / c"; |
|
209 apply (rule sym); |
|
210 apply (rule sums_unique); |
|
211 apply (rule sums_divide); |
|
212 apply (erule summable_sums); |
|
213 done; |
|
214 |
|
215 lemma sums_add: "[| x sums x0; y sums y0 |] ==> (%n. x n + y n) sums (x0+y0)" |
|
216 by (auto simp add: sums_def setsum_addf intro: LIMSEQ_add) |
|
217 |
|
218 lemma summable_add: "summable f ==> summable g ==> summable (%x. f x + g x)"; |
|
219 apply (unfold summable_def); |
|
220 apply clarify; |
|
221 apply (rule exI); |
|
222 apply (erule sums_add); |
|
223 apply assumption; |
|
224 done; |
|
225 |
|
226 lemma suminf_add: |
|
227 "[| summable f; summable g |] |
|
228 ==> suminf f + suminf g = (\<Sum>n. f n + g n)" |
|
229 by (auto intro!: sums_add sums_unique summable_sums) |
105 |
230 |
106 lemma sums_diff: "[| x sums x0; y sums y0 |] ==> (%n. x n - y n) sums (x0-y0)" |
231 lemma sums_diff: "[| x sums x0; y sums y0 |] ==> (%n. x n - y n) sums (x0-y0)" |
107 by (auto simp add: sums_def setsum_subtractf intro: LIMSEQ_diff) |
232 by (auto simp add: sums_def setsum_subtractf intro: LIMSEQ_diff) |
108 |
233 |
109 lemma suminf_mult: "summable f ==> suminf f * c = (\<Sum>n. f n * c)" |
234 lemma summable_diff: "summable f ==> summable g ==> summable (%x. f x - g x)"; |
110 by (auto intro!: sums_unique sums_mult summable_sums simp add: mult_commute) |
235 apply (unfold summable_def); |
111 |
236 apply clarify; |
112 lemma suminf_mult2: "summable f ==> c * suminf f = (\<Sum>n. c * f n)" |
237 apply (rule exI); |
113 by (auto intro!: sums_unique sums_mult summable_sums) |
238 apply (erule sums_diff); |
|
239 apply assumption; |
|
240 done; |
114 |
241 |
115 lemma suminf_diff: |
242 lemma suminf_diff: |
116 "[| summable f; summable g |] |
243 "[| summable f; summable g |] |
117 ==> suminf f - suminf g = (\<Sum>n. f n - g n)" |
244 ==> suminf f - suminf g = (\<Sum>n. f n - g n)" |
118 by (auto intro!: sums_diff sums_unique summable_sums) |
245 by (auto intro!: sums_diff sums_unique summable_sums) |
119 |
246 |
120 lemma sums_minus: "x sums x0 ==> (%n. - x n) sums - x0" |
247 lemma sums_minus: "f sums s ==> (%x. - f x) sums (- s)"; |
121 by (auto simp add: sums_def intro!: LIMSEQ_minus simp add: setsum_negf) |
248 by (simp add: sums_def setsum_negf LIMSEQ_minus); |
|
249 |
|
250 lemma summable_minus: "summable f ==> summable (%x. - f x)"; |
|
251 by (auto simp add: summable_def intro: sums_minus); |
|
252 |
|
253 lemma suminf_minus: "summable f ==> suminf (%x. - f x) = - (suminf f)"; |
|
254 apply (rule sym); |
|
255 apply (rule sums_unique); |
|
256 apply (rule sums_minus); |
|
257 apply (erule summable_sums); |
|
258 done; |
122 |
259 |
123 lemma sums_group: |
260 lemma sums_group: |
124 "[|summable f; 0 < k |] ==> (%n. setsum f {n*k..<n*k+k}) sums (suminf f)" |
261 "[|summable f; 0 < k |] ==> (%n. setsum f {n*k..<n*k+k}) sums (suminf f)" |
125 apply (drule summable_sums) |
262 apply (drule summable_sums) |
126 apply (auto simp add: sums_def LIMSEQ_def sumr_group) |
263 apply (auto simp add: sums_def LIMSEQ_def sumr_group) |